Lombok в IntelliJ: разделяем компиляцию Gradle и поддержку IDE
На этой странице
Если методы Lombok кажутся отсутствующими, сначала выполните ./gradlew clean test, чтобы понять, падает ли сборка. Поддержка IDE помогает редактору распознавать созданные члены; конфигурация процессора Gradle генерирует их при компиляции. Одно не заменяет другое.
Пример продолжает проект Initializr и HTTP-пример. Он использует Boot 4.1.2, Gradle 9.8.2 и JDK 17; BOM выбрал Lombok 1.18.48. Это одна рабочая комбинация, а не гарантия совместимости всех сочетаний JDK/Lombok.
Порядок обработки
Отдельно проверьте созданные конструкторы и getter при компиляции main и test. Исправляйте распознавание IDE после успешных тестов Wrapper.
Настройте компиляцию Gradle
Добавьте этот блок в существующий build.gradle, не дублируя уже имеющиеся объявления.
dependencies {
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
testCompileOnly 'org.projectlombok:lombok'
testAnnotationProcessor 'org.projectlombok:lombok'
}
Официальная настройка Gradle разделяет зависимости компиляции и процессоры main и test. Два тестовых объявления нужны лишь при использовании аннотаций Lombok в самих тестовых исходниках. Тесты ниже также проверяют этот путь.
Объявления без версий работают, потому что проект применяет Boot plugin и io.spring.dependency-management, который импортирует BOM Boot. В обычном Gradle-проекте задайте одну совместимую явную версию во всех нужных объявлениях либо отдельно настройте управление зависимостями этих конфигураций.
Используйте созданные конструктор и getter
Добавьте Greeting, замените существующий контроллер этой версией, сохраните HTTP-тесты и добавьте тестовый класс Lombok.
src/main/java/example/demo/Greeting.java
package example.demo;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
@Getter
@RequiredArgsConstructor
public class Greeting {
private final String message;
}
src/main/java/example/demo/GreetingController.java
package example.demo;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class GreetingController {
@GetMapping("/greeting")
public Greeting greeting() {
return new Greeting("Hello, Gradle");
}
}
src/test/java/example/demo/LombokGenerationTest.java
package example.demo;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;
class LombokGenerationTest {
@Getter
@RequiredArgsConstructor
static class Expected {
private final String message;
}
@Test
void mainSourceConstructorAndGetterAreGenerated() {
assertEquals("Hello, Gradle", new Greeting("Hello, Gradle").getMessage());
}
@Test
void testSourceConstructorAndGetterAreGenerated() {
assertEquals("test fixture", new Expected("test fixture").getMessage());
}
}
./gradlew clean test bootJar
./gradlew dependencyInsight --configuration annotationProcessor --dependency lombok
Теперь тестов пять: один контекстный, два HTTP и два генерации Lombok. Они вызывают созданные конструкторы и getter в основных и тестовых исходниках. /greeting должен продолжать возвращать тот же JSON, проверяя и сериализацию через созданный getter.
Поскольку Lombok имеет compileOnly, исполняемый JAR примера не включает его как runtime-библиотеку. Установка одного плагина IDE не обеспечивает успешную компиляцию Gradle. Для использования уже скомпилированного getter здесь не нужна runtime-зависимость Lombok implementation.
Когда ошибки показывает только IDE
Если тесты Wrapper проходят, перезагрузите Gradle-проект. Документация JetBrains указывает, что импорт процессоров из файлов сборки автоматически включает обработку аннотаций. Ручное переключение флажка не является обязательным универсальным шагом.
Затем проверьте поддержку Lombok и активацию плагина для своей версии IDE по руководству Lombok для IntelliJ. Не обобщайте, что одной редакции всегда нужна ручная установка, а другая всегда включает плагин. Также выясните, использует IDE собственный компилятор или делегирует сборку Gradle.
Если Gradle тоже падает из-за отсутствующих членов, проверьте наличие compileOnly без annotationProcessor. Если падают только тесты, изучите две тестовые конфигурации. Проверка воспроизведения подтверждает ошибку компиляции при отдельном удалении основного или тестового процессора, затем восстанавливает их и снова проверяет все пять тестов. Работа с интерфейсом IDE этими проверками не охвачена.
Обсуждение