问题描述
我正在MapStruct博客上关注the guide,但无法同时使用这3种技术。 我一直在尝试从MapStruct文档,错误报告,此处发布的几种方法,但是在每种情况下,我最终在构建过程中都会收到以下异常。
有人在Quarkus下成功地与Lombok一起使用了MapStruct吗?任何帮助表示赞赏。
奇怪的是,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)
...
映射器配置:
@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依赖方法(使用和不使用方法#1中的maven-compiler-plugin,以及使用和不使用CommentProcessorPaths)
<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 源文件夹正在将生成的源和mapstruct实现添加到源路径。然后,mapstruct处理器将尝试再次注册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>