java 如何通过maven-compiler-plugin使用多个注解处理器

l0oc07j2  于 2023-05-21  发布在  Java
关注(0)|答案(2)|浏览(226)

我有一个spring Boot 项目,它有lombok和mapstruct,并使用maven作为构建工具。我需要在编译时处理注解,并将结果生成的源代码与最终的jar打包在一起。构建成功。但是,最终的jar缺少mapstruct实现类。当我尝试启动spring Boot 应用程序时出现的错误是:
应用程序启动失败
说明:
com.some_org.service.salesforce.object.processor中的字段salesforceObjectMapper。SalesforceObjectProcessor需要类型为“com.some_org.service.salesforce.object.mapper.SalesforceObjectMapper”的Bean,但找不到该Bean。
行动:
考虑在配置中定义类型为“com.some_org.service.salesforce.object.mapper.SalesforceObjectMapper”的Bean。
下面是我的maven-compiler-plugin设置:

<plugin>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.7.0</version>
    <configuration>
        <source>1.8</source>
        <target>1.8</target>
        <annotationProcessorPaths>
            <path>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <version>1.18.12</version>
            </path>
            <path>
                <groupId>org.mapstruct</groupId>
                <artifactId>mapstruct-processor</artifactId>
                <version>1.2.0.Final</version>
            </path>
        </annotationProcessorPaths>
        <compilerArgs>
            <compilerArg>-Amapstruct.suppressGeneratorTimestamp=true</compilerArg>
            <compilerArg>-Amapstruct.suppressGeneratorVersionInfoComment=true</compilerArg>
        </compilerArgs>
    </configuration>
</plugin>
szqfcxe2

szqfcxe21#

最终通过在编译阶段使用执行覆盖默认编译目标解决了这个问题,如下所示:

<plugin>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.7.0</version>
    <executions>
        <execution>
            <id>Compile With Annotation Processing</id>
            <phase>compile</phase>
            <goals>
                <goal>compile</goal>
            </goals>
            <configuration>
                <source>1.8</source>
                <target>1.8</target>
                <annotationProcessorPaths>
                    <path>
                        <groupId>org.projectlombok</groupId>
                        <artifactId>lombok</artifactId>
                        <version>1.18.12</version>
                    </path>
                    <path>
                        <groupId>org.mapstruct</groupId>
                        <artifactId>mapstruct-processor</artifactId>
                        <version>1.2.0.Final</version>
                    </path>
                </annotationProcessorPaths>
                <compilerArgs>
                    <compilerArg>-Amapstruct.suppressGeneratorTimestamp=true</compilerArg>
                    <compilerArg>-Amapstruct.suppressGeneratorVersionInfoComment=true</compilerArg>
                </compilerArgs>
            </configuration>
        </execution>
    </executions>
</plugin>
9w11ddsr

9w11ddsr2#

如果你的lombok和mapstruct不能很好地配合,你可以使用lombok-mapstruct-binding来解决冲突(你不需要把它放在execution标签中)。关键是将绑定工件包含在与lombok和mapstruct注解处理器配置相同的位置。在我的情况下效果很好!

<build>
  <plugins>
    <plugin>
      ..
      <configuration>
        ..
        <annotationProcessorPaths>
        <path>
          <groupId>org.projectlombok</groupId>
          <artifactId>lombok</artifactId>
          <version>1.18.20</version>
        </path>
        <path>
          <groupId>org.projectlombok</groupId>
          <artifactId>lombok-mapstruct-binding</artifactId>
          <version>0.2.0</version>
        </path>
        <path>
          <groupId>org.mapstruct</groupId>
          <artifactId>mapstruct-processor</artifactId>
          <version>1.4.2.Final</version>
        </path>
      </annotationProcessorPaths>
    </plugin>
  <plugins>
<build>

相关问题