java:修复aspectj-maven-plugin插件在java9项目中执行报错:cannot be resolved to a module
javadocreader9(https://gitee.com/l0km/javadocreader9)是我最近写的一个基于Java 9 的javadoc读取java代码注释的工具。在基于Java 9(我用的编译器JDK 19)编译时,aspectj-maven-plugin
插件在执行报了一堆错误: xxx cannot be resolved to a module
,如下:
[INFO] --- aspectj-maven-plugin:1.15.0:compile (default) @ javadocreader9 ---
[INFO] Showing AJC message detail for messages of types: [error, warning, fail]
[ERROR] com.google.common cannot be resolved to a module
J:\javadocreader9\src\main\java\module-info.java:5
requires transitive com.google.common;
^^^^^^^^^^^^^^^^^
[ERROR] com4j.base2 cannot be resolved to a module
J:\javadocreader9\src\main\java\module-info.java:6
requires transitive com4j.base2;
^^^^^^^^^^^
[ERROR] com4j.base cannot be resolved to a module
J:\javadocreader9\src\main\java\module-info.java:7
requires transitive com4j.base;
^^^^^^^^^^
[ERROR] aocache cannot be resolved to a module
J:\javadocreader9\src\main\java\module-info.java:8
requires aocache;
^^^^^^^
显示所有的模块在都不能被aspectj-maven-plugin
识别,这些模块名都是javadocreader9的module-info.java
中定义的模块名。
如下是module-info.java
定义
module com.gitee.l0km.javadocreader{
exports com.gitee.l0km.javadocreader;
requires java.desktop;
requires transitive jdk.javadoc;
requires transitive com.google.common;
requires transitive com4j.base2;
requires transitive com4j.base;
requires aocache;
}
如下是javadocreader9的pom.xml片段:
<project>
<properties>
<maven.compiler.source>9</maven.compiler.source>
<maven.compiler.target>9</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<com4j.version>4.0.0</com4j.version>
<aocache.version>0.4.5</aocache.version>
<aspectj.version>1.9.21</aspectj.version>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>aspectj-maven-plugin</artifactId>
<version>1.15.0</version>
<configuration>
<encoding>UTF-8</encoding>
<complianceLevel>9</complianceLevel>
<verbose>true</verbose>
<showWeaveInfo>true</showWeaveInfo>
<!-- 忽略adviceDidNotMatch警告-->
<Xlint>adviceDidNotMatch=ignore</Xlint>
<aspectLibraries>
<aspectLibrary>
<groupId>com.gitee.l0km</groupId>
<artifactId>aocache</artifactId>
</aspectLibrary>
</aspectLibraries>
</configuration>
<executions>
<execution>
<goals>
<goal>compile</goal>
</goals>
</execution>
</executions>
<dependencies>
<!-- 确保编译器使用的aspectj工具版本与依赖项使用的版本相同。避免警告 -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjtools</artifactId>
<version>${aspectj.version}</version>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>
</project>
解决方案一
使用dev.aspectj:aspectj-maven-plugin:1.14
插件代替org.codehaus.mojo:aspectj-maven-plugin:1.15.0
来执行编译时织入。
org.codehaus.mojo:aspectj-maven-plugin
是Apache Maven官方提供的插件,我们在网上找到关于aspectj-maven-plugin插件的介绍都是基于这个插件的。
dev.aspectj:aspectj-maven-plugin
是eclipse aspectj项目官方提供的插件,
我不太清楚为什么有两个官方插件。但是dev.aspectj:aspectj-maven-plugin
从1.13
版本开始为解决module无法解析问题,增加了<javaModules></javaModules>
参数,用于定义ajc
的 --module-path
参数,说明如下图:
参见 https://dev-aspectj.github.io/aspectj-maven-plugin/compile-mojo.html#javaModules
根据这个参数,我修改了pom.xml,使用dev.aspectj:aspectj-maven-plugin:1.14
插件代替org.codehaus.mojo:aspectj-maven-plugin:1.15.0
,并增加了<javaModules></javaModules>
参数定义如下:
<project>
<properties>
<maven.compiler.source>9</maven.compiler.source>
<maven.compiler.target>9</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<com4j.version>4.0.0</com4j.version>
<aocache.version>0.4.5</aocache.version>
<aspectj.version>1.9.21</aspectj.version>
</properties>
<build>
<plugins>
<plugin>
<groupId>dev.aspectj</groupId>
<version>1.14</version>
<artifactId>aspectj-maven-plugin</artifactId>
<configuration>
<encoding>UTF-8</encoding>
<complianceLevel>9</complianceLevel>
<verbose>true</verbose>
<showWeaveInfo>true</showWeaveInfo>
<!-- 忽略adviceDidNotMatch警告-->
<Xlint>adviceDidNotMatch=ignore</Xlint>
<aspectLibraries>
<aspectLibrary>
<groupId>com.gitee.l0km</groupId>
<artifactId>aocache</artifactId>
</aspectLibrary>
</aspectLibraries>
<javaModules>
<javaModule>
<groupId>com.gitee.l0km</groupId>
<artifactId>com4j-base</artifactId>
</javaModule>
<javaModule>
<groupId>com.gitee.l0km</groupId>
<artifactId>com4j-base2</artifactId>
</javaModule>
<javaModule>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
</javaModule>
<javaModule>
<groupId>com.gitee.l0km</groupId>
<artifactId>aocache</artifactId>
</javaModule>
</javaModules>
</configuration>
<executions>
<execution>
<goals>
<goal>compile</goal>
</goals>
</execution>
</executions>
<dependencies>
<!-- 确保编译器使用的aspectj工具版本与依赖项使用的版本相同。避免警告 -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjtools</artifactId>
<version>${aspectj.version}</version>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>
</project>
修改后效果立竿见影,aspectj-maven-plugin
的报错减少了,只剩下aocache
这个模块找不到。
[INFO] --- aspectj-maven-plugin:1.14:compile (default) @ javadocreader9 ---
[INFO] Showing AJC message detail for messages of types: [error, warning, fail]
[ERROR] aocache cannot be resolved to a module
J:\javadocreader9\src\main\java\module-info.java:8
requires aocache;
^^^^^^^
关于aocache
这个模块为什么找不到,我至今也没想明白原因,aocache
这个模块也是我写的(仓库地址https://gitee.com/l0km/aocache)。除了项目使用org.apache.maven.plugins:maven-shade-plugin
插件打包之外,它与同样是我写的模块com4j.base
,com4j-base2
(仓库地址https://gitee.com/l0km/common-java)相比没有什么特别的。我尝试了很多方式改进aocache
但就是无法解决这个问题。问题只能留待以后了。
解决方案二
如果你的项目使用解决方案一就能解决问题,可以不用看这部分了。
因为我使用解决方案一,仍然无法解决找不到aocache
这个模块的问题,我只能继续想辙。
aspectj-maven-plugin
的报错一直都是聚集在模块定义文件module-info.java
上。因为module-info.java
解析失败,后续会导致所有引用该模块的包名统统报错。
如果不让aspectj-maven-plugin
编译module-info.java
这个文件,是不是就能解决问题呢?
于是我用回org.codehaus.mojo:aspectj-maven-plugin:1.15.0
插件,在插件定义中增加源码排除定义(<excludes></excludes>
),不编译module-info.java
,如下:
<sources>
<source>
<basedir>src/main/java</basedir>
<excludes>
<exclude>module-info.java</exclude>
</excludes>
</source>
</sources>
果然问题解决,
当然使用源码包含定义(<includes></includes>
)指定只编译需要织入的代码,效果也是一样的
<sources>
<source>
<basedir>src/main/java</basedir>
<includes>
<include>**/JavadocReader.java</include>
</includes>
</source>
</sources>
<excludes></excludes>
和<includes></includes>
的说明如下图:
https://www.mojohaus.org/aspectj-maven-plugin/compile-mojo.html#includes
https://www.mojohaus.org/aspectj-maven-plugin/compile-mojo.html#excludes
pom.xml片段如下。
<project>
<properties>
<maven.compiler.source>9</maven.compiler.source>
<maven.compiler.target>9</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<com4j.version>4.0.0</com4j.version>
<aocache.version>0.4.5</aocache.version>
<aspectj.version>1.9.21</aspectj.version>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>aspectj-maven-plugin</artifactId>
<version>1.15.0</version>
<configuration>
<encoding>UTF-8</encoding>
<complianceLevel>9</complianceLevel>
<verbose>true</verbose>
<showWeaveInfo>true</showWeaveInfo>
<!-- 忽略adviceDidNotMatch警告-->
<Xlint>adviceDidNotMatch=ignore</Xlint>
<sources>
<source>
<basedir>src/main/java</basedir>
<excludes>
<exclude>module-info.java</exclude>
</excludes>
</source>
</sources>
<aspectLibraries>
<aspectLibrary>
<groupId>com.gitee.l0km</groupId>
<artifactId>aocache</artifactId>
</aspectLibrary>
</aspectLibraries>
</configuration>
<executions>
<execution>
<goals>
<goal>compile</goal>
</goals>
</execution>
</executions>
<dependencies>
<!-- 确保编译器使用的aspectj工具版本与依赖项使用的版本相同。避免警告 -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjtools</artifactId>
<version>${aspectj.version}</version>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>
</project>
参考资料
《javaModules》
《includes》
《excludes》