微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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>

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐