在Quarkus下将MapStruct与Lombok一起使用

问题描述

我正在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>