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 трёхслойная подходит, для сложного домена гексагональная изолирует бизнес-логику от инфраструктуры.