在 Quarkus 下使用 MapStruct 和 Lombok
Using MapStruct together with Lombok under Quarkus
我在 MapStruct 博客上关注 the guide,但同时使用这 3 种技术时遇到了问题。
我一直在尝试 MapStruct 文档、错误报告、此处的帖子中的几种方法,但在每种情况下,我最终都会在构建过程中收到以下 异常。
有没有人在 Quarkus 下成功地将 MapStruct 与 Lombok 一起使用?感谢您的帮助。
奇怪的是,mvn clean
之后的第一个 compile
总是成功,而第二个 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)
...
映射器配置:
@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.使用插件 annotationProcessorPaths
<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 依赖方法(使用和不使用方法 #1 中的 maven-compiler-plugin。以及使用和不使用 annotationProcessorPaths)
<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>
在我们的案例中,它与 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>
问题是我们的 add-source sourcefolder 正在将生成的源和 mapstruct 实现添加到源路径。然后 mapstruct-processor 将尝试再次注册 mapstruct 源,这将导致冲突。
解决方案:我必须更具体地使用 add-sources 文件夹路径并排除文件夹,其中 mapstruct 将生成的 Java 类.
感谢@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>
@the_quail 是对的 我在添加 org.codehaus.mojo 时遇到了类似的问题,以便从 soap ws url.
中自动生成存根
所以我更改了生成源的路径
${project.build.directory}/生成源
${project.build.directory}/generated-sources/wsdl
我在 MapStruct 博客上关注 the guide,但同时使用这 3 种技术时遇到了问题。 我一直在尝试 MapStruct 文档、错误报告、此处的帖子中的几种方法,但在每种情况下,我最终都会在构建过程中收到以下 异常。
有没有人在 Quarkus 下成功地将 MapStruct 与 Lombok 一起使用?感谢您的帮助。
奇怪的是,mvn clean
之后的第一个 compile
总是成功,而第二个 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)
...
映射器配置:
@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.使用插件 annotationProcessorPaths
<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 依赖方法(使用和不使用方法 #1 中的 maven-compiler-plugin。以及使用和不使用 annotationProcessorPaths)
<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>
在我们的案例中,它与 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>
问题是我们的 add-source sourcefolder 正在将生成的源和 mapstruct 实现添加到源路径。然后 mapstruct-processor 将尝试再次注册 mapstruct 源,这将导致冲突。
解决方案:我必须更具体地使用 add-sources 文件夹路径并排除文件夹,其中 mapstruct 将生成的 Java 类.
感谢@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>
@the_quail 是对的 我在添加 org.codehaus.mojo 时遇到了类似的问题,以便从 soap ws url.
中自动生成存根所以我更改了生成源的路径
${project.build.directory}/生成源
${project.build.directory}/generated-sources/wsdl