Использование MapStruct совместно с Lombok в Quarkus

#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