#java #lombok #quarkus #mapstruct
#java #ломбок #quarkus #mapstruct
Вопрос:
Я следую руководству в блоге MapStruct и испытываю проблемы с совместным использованием этих 3 технологий. Я пробовал несколько подходов из документов MapStruct, отчетов об ошибках, сообщений отсюда, но в каждом случае я получаю следующее исключение во время сборки.
Кто-нибудь успешно использовал MapStruct вместе с Lombok в Quarkus? Любая помощь приветствуется.
Как ни странно, первое compile
после mvn clean
всегда выполняется успешно, а второе compile
или запуск приложения выдает это:
Error:(9,8) java: Internal error in the mapping processor: java.lang.RuntimeException:
javax.annotation.processing.FilerException: Attempt to recreate a file for type com.example.service.RawContentDtoMapperImpl
at org.mapstruct.ap.internal.processor.MapperRenderingProcessor.createSourceFile(MapperRenderingProcessor.java:59)
at org.mapstruct.ap.internal.processor.MapperRenderingProcessor.writeToSourceFile(MapperRenderingProcessor.java:39)
...
Конфигурация Mapper:
@MapperConfig(componentModel = "cdi")
public interface QuarkusMappingConfig {
}
Картограф:
@Mapper(config = QuarkusMappingConfig.class, unmappedTargetPolicy = ReportingPolicy.IGNORE)
public interface RawContentDtoMapper {
RawContentDTO toResource(RawContent rawContent);
}
С помощью pom.xml Я попробовал несколько разных подходов из всех руководств, которые я нашел для компоновки MapStruct Quarkus и MapStruct Lombok. Включая соответствующие разделы из двух основных подходов:
Общие свойства
<properties>
<compiler-plugin.version>3.8.1</compiler-plugin.version>
<maven.compiler.parameters>true</maven.compiler.parameters>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
...
<org.mapstruct.version>1.4.0.Beta3</org.mapstruct.version>
<org.projectlombok.version>1.18.12</org.projectlombok.version>
</properties>
1. Использование аннотации плагина PROCESSORPATHS
<dependencies>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
<version>${org.mapstruct.version}</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${org.projectlombok.version}</version>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>${maven.compiler.source}</source>
<target>${maven.compiler.target}</target>
<annotationProcessorPaths>
<path>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>${org.mapstruct.version}</version>
</path>
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${org.projectlombok.version}</version>
</path>
</annotationProcessorPaths>
</configuration>
</plugin>
</plugins>
</pluginManagement>
</build>
2. Использование подхода mapstruct-processor depencency (с подключаемым модулем maven-compiler-plugin из подхода № 1 и без него. а также с путями обработки аннотаций)
<dependencies>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
<version>${org.mapstruct.version}</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${org.projectlombok.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>${org.mapstruct.version}</version>
<scope>provided</scope>
</dependency>
</dependencies>
Комментарии:
1. Вы использовали quarkus для горячего развертывания? Я помню, что там тоже были некоторые проблемы. Вызывает ли проблемы (обычная) установка maven clean, а затем запуск quarkus?
2. Общая проблема заключается в том, что Lombok создает новый материал при обработке аннотаций в существующих классах. Это запрещено в соответствии с JSR269. Проблема, с которой сталкивается MapStruct, заключается в том, чтобы дождаться завершения lombok. MapStruct создал точку интеграции для этого (SPI), которую Lombok должен вызывать. проверка: github.com/mapstruct/mapstruct/blob/master/processor/src/main /…
3. У меня только что была такая же проблема. Не уверен на 100%, что именно это исправило проблему, но в моем POM я изменил порядок процессоров аннотаций в разделе плагины сборки, чтобы Lombok был перед Mapstruct. После этого, как ни странно, это сработало.
Ответ №1:
В нашем случае это было связано не с Quarkus, а с
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>build-helper-maven-plugin</artifactId>
<version>${build-helper-maven-plugin.version}</version>
<executions>
<execution>
<id>add-generated-source</id>
<phase>generate-sources</phase>
<goals>
<goal>add-source</goal>
</goals>
<configuration>
<sources>
<source>${generated-sources-path}/wsdl</source>
</sources>
</configuration>
</execution>
</executions>
</plugin>
Проблема заключалась в том, что наш sourcefolder add-source добавлял сгенерированные источники И реализацию mapstruct в исходный путь. Затем mapstruct-processor попытается снова зарегистрировать исходные файлы mapstruct, что приведет к конфликтам.
Решение: мне пришлось уточнить путь к папке add-sources и исключить папку, в которую mapstruct помещает сгенерированные классы Java.
Комментарии:
1. Это был самый ценный / значимый ответ после множества попыток И поиска ответов. Что касается порядка путей в annotationProcessorPaths, даже это не сработало для меня.
2. @xomoni Что у вас сработало?
Ответ №2:
спасибо @jste89. Я просто инвертирую процессор аннотаций, чтобы он работал
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>${compiler-plugin.version}</version>
<configuration>
<annotationProcessorPaths>
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.80</version>
</path>
<path>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>1.4.2.Final</version>
</path>
</annotationProcessorPaths>
</configuration>
</plugin>
Ответ №3:
@the_quail прав, у меня была похожая проблема, когда я добавлял org.codehaus.моджо для автоматической генерации заглушек формирует URL soap ws.
итак, я изменил путь для генерации источников
${project.build.directory}/сгенерированный-источники
${project.build.directory}/generated-sources/wsdl