← Заметки

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.

Порядок обработки

Компиляция Lombok до исправлений IDE

Отдельно проверьте созданные конструкторы и 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 этими проверками не охвачена.

Обсуждение

Посмотреть на GitHub ↗