Решение проблемы совместимости MapStruct и Lombok в Java
Пройдите тест, узнайте какой профессии подходите
Быстрый ответ
Давайте научимся синхронизировать работу библиотек Lombok и MapStruct для исключения ошибок при компиляции. Вам потребуется правильно настроить плагин maven-compiler-plugin
:
<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, и ошибки, связанные с неизвестным свойством
, исчезнут.
Гармония Lombok и MapStruct: настройки и конфигурации
Maven и Gradle: союз двух систем сборки
В Maven recomendуется подключить lombok-mapstruct-binding
для обеспечения стабильного взаимодействия между Lombok, начиная с версии 1.18.16, и MapStruct:
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok-mapstruct-binding</artifactId>
<version>0.2.0</version>
<scope>provided</scope> <!-- Это нужно, чтобы библиотека не попала в окончательный пакет -->
</dependency>
Схема для пользователей Gradle выглядит следующим образом:
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 – это шеф-повар (🧑🍳), использующий эти ингредиенты для приготовления изысканных блюд (реализующий маппинг).
Lombok (👨🍳): помощник повара
– Создаёт геттеры, сеттеры и набор других компонентов со скоростью света.
@Data // Аннотация Lombok
public class Dish {
private String seasoning;