Gymterview
junior

Как инициализировать современный Java-проект?

Инициализация современного Java-проекта начинается с выбора Java 21 LTS, Spring Boot 3.x и системы сборки Gradle с Kotlin DSL.

Ключевые возможности Java 21+

Примеры возможностей Java 21
// Virtual Threads (Project Loom) — Java 21
try (var executor = Executors.newVirtualThreadPerTaskExecutor()) {
    List<Future<String>> futures = urls.stream()
        .map(url -> executor.submit(() -> fetchData(url)))
        .toList();
}

// Pattern Matching for switch — Java 21
String describe(Object obj) {
    return switch (obj) {
        case Integer i when i > 0 -> "positive: " + i;
        case String s -> "string: " + s;
        case null -> "null value";
        default -> "unknown: " + obj;
    };
}

// Record Patterns — Java 21
record Point(int x, int y) {}
record Line(Point start, Point end) {}

void printLength(Object obj) {
    if (obj instanceof Line(Point(var x1, var y1), Point(var x2, var y2))) {
        double length = Math.sqrt(Math.pow(x2 - x1, 2) + Math.pow(y2 - y1, 2));
        System.out.println("Length: " + length);
    }
}

// Sequenced Collections — Java 21
SequencedCollection<String> list = new ArrayList<>();
list.addFirst("first");
list.addLast("last");
String first = list.getFirst();

Spring Boot 3.x стартер с Gradle

build.gradle.kts
plugins {
    java
    id("org.springframework.boot") version "3.4.1"
    id("io.spring.dependency-management") version "1.1.7"
}

group = "com.example"
version = "0.0.1-SNAPSHOT"

java {
    toolchain {
        languageVersion = JavaLanguageVersion.of(21)
    }
}

repositories {
    mavenCentral()
}

dependencies {
    implementation("org.springframework.boot:spring-boot-starter-web")
    implementation("org.springframework.boot:spring-boot-starter-data-jpa")
    implementation("org.springframework.boot:spring-boot-starter-validation")
    implementation("org.springframework.boot:spring-boot-starter-actuator")
    implementation("org.springframework.boot:spring-boot-starter-security")

    runtimeOnly("org.postgresql:postgresql")
    runtimeOnly("io.micrometer:micrometer-registry-prometheus")

    compileOnly("org.projectlombok:lombok")
    annotationProcessor("org.projectlombok:lombok")

    testImplementation("org.springframework.boot:spring-boot-starter-test")
    testImplementation("org.springframework.security:spring-security-test")
    testImplementation("org.testcontainers:junit-jupiter")
    testImplementation("org.testcontainers:postgresql")
}

tasks.withType<Test> {
    useJUnitPlatform()
}

Структура проекта (гексагональная архитектура)

Гексагональная (порты и адаптеры) архитектура изолирует бизнес-логику от инфраструктуры:

Пример
order-service/
├── src/main/java/com/example/order/
│   ├── domain/                    # Ядро (нет зависимостей на фреймворки)
│   │   ├── model/                 # Entity, Value Object, Enum
│   │   ├── port/in/               # Входные порты (use cases)
│   │   ├── port/out/              # Выходные порты (SPI)
│   │   ├── service/               # Реализация use cases
│   │   └── exception/
│   ├── adapter/                   # Адаптеры (инфраструктура)
│   │   ├── in/web/                # REST контроллеры, DTO, mapper
│   │   ├── in/kafka/              # Kafka consumers
│   │   └── out/                   # JPA, внешние сервисы, messaging
│   └── config/                    # Конфигурация Spring
├── src/main/resources/
│   ├── application.yml
│   ├── application-local.yml
│   └── db/migration/              # Flyway миграции

Gradle vs Maven в 2026

Критерий Gradle Maven
Build cache Инкрементальная компиляция, build cache Нет нативного build cache
DSL Kotlin DSL с типобезопасностью XML
Multi-module Гибкость для сложных проектов Конвенция над конфигурацией
Популярность Основной для новых проектов Legacy и enterprise со стандартизацией

Spring Initializr

Пример
curl https://start.spring.io/starter.zip \
  -d type=gradle-project \
  -d language=java \
  -d bootVersion=3.4.1 \
  -d javaVersion=21 \
  -d groupId=com.example \
  -d artifactId=order-service \
  -d dependencies=web,data-jpa,postgresql,security,actuator,validation \
  -o order-service.zip

Частые ошибки

  • Использование Java 8 или 11 в новых проектах — нет причин не использовать Java 21
  • Структурирование по техническим слоям (controllers/, services/) вместо доменных модулей
  • Смешивание DTO и доменных моделей: JPA-сущность не должна возвращаться напрямую из REST API
  • Отсутствие файлов профилей (application-local.yml, application-prod.yml)

На собеседовании: покажите, что знаете актуальные версии (Java 21, Spring Boot 3.x) и умеете обосновать структуру проекта. Частый вопрос: “Зачем гексагональная архитектура, а не трёхслойная?” Ответ: для простых CRUD трёхслойная подходит, для сложного домена гексагональная изолирует бизнес-логику от инфраструктуры.