Решение проблемы совместимости MapStruct и Lombok в Java

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Давайте научимся синхронизировать работу библиотек Lombok и MapStruct для исключения ошибок при компиляции. Вам потребуется правильно настроить плагин maven-compiler-plugin:

xml
Скопировать код
<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.8.1</version>
            <configuration>
                <annotationProcessorPaths>
                    <!-- Сначала подключаем Lombok для первичной обработки кода -->
                    <path>
                        <groupId>org.projectlombok</groupId>
                        <artifactId>lombok</artifactId>
                        <version>LATEST_LOMBOK_VERSION</version>
                    </path>
                    <!-- После Lombok подключаем MapStruct -->
                    <path>
                        <groupId>org.mapstruct</groupId>
                        <artifactId>mapstruct-processor</artifactId>
                        <version>LATEST_MAPSTRUCT_VERSION</version>
                    </path>
                </annotationProcessorPaths>
                <!-- Задаем целевую версию Java для обеспечения совместимости -->
                <source>1.8</source>
                <target>1.8</target>
            </configuration>
        </plugin>
    </plugins>
</build>

Не забудьте заменить LATEST_LOMBOK_VERSION и LATEST_MAPSTRUCT_VERSION на актуальные версии библиотек. Данная последовательность подключений гарантирует, что код Lombok будет обработан до активации MapStruct, и ошибки, связанные с неизвестным свойством, исчезнут.

Кинга Идем в IT: пошаговый план для смены профессии

Гармония Lombok и MapStruct: настройки и конфигурации

Maven и Gradle: союз двух систем сборки

В Maven recomendуется подключить lombok-mapstruct-binding для обеспечения стабильного взаимодействия между Lombok, начиная с версии 1.18.16, и MapStruct:

xml
Скопировать код
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok-mapstruct-binding</artifactId>
    <version>0.2.0</version>
    <scope>provided</scope> <!-- Это нужно, чтобы библиотека не попала в окончательный пакет -->
</dependency>

Схема для пользователей Gradle выглядит следующим образом:

groovy
Скопировать код
annotationProcessor 'org.projectlombok:lombok:latest' // Сначала обрабатываем аннотации Lombok.
compileOnly 'org.projectlombok:lombok:latest' // Не включаем Lombok в сборку.
annotationProcessor 'org.mapstruct:mapstruct-processor:latest' // MapStruct обрабатываем позже.

Помните о замене latest на актуальные версии пакетов для гарантии безошибочной работы.

IntelliJ IDEA: дирижёр процесса

IntelliJ IDEA тоже выполняет важную роль. В редакторе можно активировать обработку аннотаций:

  • Откройте Настройки или Предпочтения.
  • Перейдите в раздел Сборка, выполнение, развёртывание > Компилятор > Обработчики аннотаций.
  • Включите опцию Включить обработку аннотаций.

Возможно, придется указать версии source и target Java, например, Java 8, в настройках IntelliJ для обеспечения корректной компиляции.

Визуализация

Вообразим так: Lombok – это активный помощник повара (👨‍🍳), быстро нарезающий овощи и рыбу (генерирующий поля в классах), в то время как MapStruct – это шеф-повар (🧑‍🍳), использующий эти ингредиенты для приготовления изысканных блюд (реализующий маппинг).

Markdown
Скопировать код
Lombok (👨‍🍳): помощник повара
 – Создаёт геттеры, сеттеры и набор других компонентов со скоростью света.
Java
Скопировать код
@Data // Аннотация Lombok
public class Dish {
    private String seasoning;