Maven - 一篇带你理解 AnnotationProcessorPaths 使用
Posted 程序员牧码
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Maven - 一篇带你理解 AnnotationProcessorPaths 使用相关的知识,希望对你有一定的参考价值。
业务场景
一个类通过一个注解实现预编译(通过 javax.annotation.processing.Processor)比如:Lombok,MapStruct…DDDD~
问题描述
以前在本项目中(META-INF.services.javax.annotation.processing.Processor)中,因为不能 mvn install 同时编译然后讲加了注解的源文件再经过 Processor 编译,所以每次都只能手动对该源文件进行编译。
但是我讲整个项目打成 jar 引到一个 A 项目(无父子模块)中的时,直接可以 mvn install 下来,并且里面也会同时对那个源文件进行 Processor 编译,成功!
A 项目 pom 文件
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
</plugin>
</plugins>
</build>
现在我将这个 jar 引入到一个 B 项目(属于父子模块并且在子模块中)时,再 mvn install 的时候发现并编译出来的文件并没经过 Processor 编译,失败了唉~
问题分析
于是对上述 A、B 项目进行 Pom 分析,因为其他基本都一样引包方式也都是本地引入,一开始还怀疑是不是父子项目模块 $basedir 的问题,因为该 jar pom 里面有这个配置
jar pom 文件
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>2.6</version>
<executions>
<execution>
<id>process-META</id>
<!-- 打包前再将文件拷贝过来 -->
<phase>prepare-package</phase>
<goals>
<goal>copy-resources</goal>
</goals>
<configuration>
<outputDirectory>target/classes</outputDirectory>
<resources>
<resource>
<directory>$basedir/src/main/resources/</directory>
<includes>
<include>**/*</include>
</includes>
</resource>
</resources>
</configuration>
</execution>
</executions>
</plugin>
此时,就把 A 项目改造成或者说模拟成 B 项目的情景,但是发现仍然是好的,所以先排除这个 $basedir 引起的问题。
后来再仔细对比后发现有个配置叫(我们的主角来了)<annotationProcessorPaths> 存在于 B 项目的父模块中
B 项目 pom 文件
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>8</source>
<target>8</target>
<encoding>UTF-8</encoding>
<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>1.18.12</version>
</path>
</annotationProcessorPaths>
</configuration>
</plugin>
有没发现 <annotationProcessorPaths> 和之前上面提到的 Processor 很像,而且 mapstruct 和 lombok 都参与了,那么我们的 jar 是不是也应该插一jio~
解决方案
1、去除 <annotationProcessorPaths> 限制
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>8</source>
<target>8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
2、添加 <annotationProcessorPaths> 配置
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>8</source>
<target>8</target>
<encoding>UTF-8</encoding>
<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>1.18.12</version>
</path>
<!-- 这就是文中提到的 jar -->
<path>
<groupId>com.chinadaas.platform</groupId>
<artifactId>dflow</artifactId>
<version>0.1-SNAPSHOT</version>
</path>
</annotationProcessorPaths>
</configuration>
</plugin>
以上是关于Maven - 一篇带你理解 AnnotationProcessorPaths 使用的主要内容,如果未能解决你的问题,请参考以下文章
多线程 - 一篇带你理解 InheritableThreadLocal 作用
多线程 - 一篇带你理解 InheritableThreadLocal 作用