java:修复aspectj-maven-plugin插件在java9项目中执行报错:cannot be resolved to a module

embedded/2024/11/9 2:31:47/

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 moduleJ:\javadocreader9\src\main\java\module-info.java:5
requires transitive com.google.common;^^^^^^^^^^^^^^^^^[ERROR] com4j.base2 cannot be resolved to a moduleJ:\javadocreader9\src\main\java\module-info.java:6
requires transitive com4j.base2;^^^^^^^^^^^[ERROR] com4j.base cannot be resolved to a moduleJ:\javadocreader9\src\main\java\module-info.java:7
requires transitive com4j.base;^^^^^^^^^^[ERROR] aocache cannot be resolved to a moduleJ:\javadocreader9\src\main\java\module-info.java:8
requires aocache;^^^^^^^

显示所有的模块在都不能被aspectj-maven-plugin识别,这些模块名都是javadocreader9的module-info.java中定义的模块名。
如下是module-info.java定义

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-plugin1.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 moduleJ:\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》


http://www.ppmy.cn/embedded/136053.html

相关文章

TypeScript 支持的常见运算符

下面是对 TypeScript 支持的常见运算符的汇总&#xff0c;包括 算术运算符、赋值运算符、比较运算符 等内容&#xff0c;另外补充了 ! 和 !! 运算符的用法。 1. 算术运算符 加法运算符- 减法运算符* 乘法运算符/ 除法运算符% 取余运算符 自增运算符-- 自减运算符 let a 10, b…

从零开始搭建Halo个人博客

前言 老话说得好&#xff0c;好记性不如烂笔头。对于程序员来说&#xff0c;学无止境&#xff0c;需要学习的东西很多&#xff0c;而如果不记录下来可能过不了多久就忘记了&#xff0c;而记录下来这一步也能很好地贯彻费曼学习法。 其实网上有很多博客平台&#xff0c;但是自…

梧桐数据库SQL分析对比之订单最多的客户

一、背景说明 在特定的业务场景&#xff0c;许多业务部门需要推送业务订单最多的客户。需要编写一个解决方案&#xff0c;找出业务订单最多的客户。 本次以三种不同数据库进行分析和用例讲解&#xff0c;分别是梧桐数据库&#xff0c;mysql &#xff0c;oracle 。 二、表结构…

HFSS 3D Layout中Design setting各个选项的解释

从HFSS 3D LAYOUT菜单中&#xff0c;选择Design Settings打开窗口&#xff0c;会有六个选项&#xff1a;DC Extrapolation, Nexxim Options, Export S Parameters, Lossy Dielectrics, HFSS Meshing Method, and HFSS Adaptive Mesh. DC Extrapolation 直流外推 直流外推分为标…

计算机网络——IP协议

ICMP Traceroute upper layer表示上层用户标识——TCP还是UDP IP数据报格式的校验和主要检测头部是否出错 Options会将源主机到目标主机所经过的路由器和交换机进行记录 IP地址 同一个子网下&#xff0c;前缀相同 子网间的收发一跳可达&#xff0c;不用借助路由器&#xff0c;可…

7.0、RIP

RIP (Routing Information Protocol) 简介 RIP是由Xerox在20世纪70年代开发的&#xff0c;最初定义在RFC1058中。RIP用两种数据包传输更新:更新和请求&#xff0c;每个有RIP功能的路由器在默认情况下&#xff0c;每隔30s利用UDP520端口向与它直连的网络邻居广播(RIP1)或组播(R…

Springboot项目报错记录

SpringBoot测试报错&#xff1a;Unable to find a SpringBootConfiguration, you need to use Context 该测试类所在测试包test下的包名和类路径java下的包名不一致导致的 引发以下报错 java.lang.IllegalStateException: Unable to find a SpringBootConfiguration, you need…

智能提醒助理系列-jdk8升级到21,springboot2.3升级到3.3

本系列文章记录“智能提醒助理”产品建设历程&#xff0c;记录实践经验、巩固知识点、锻炼总结能力。 本篇介绍技术栈升级的过程&#xff0c;遇到的问题和解决方案。 一、需求出发点 智能提醒小程序 当前使用的是jdk8&#xff0c;springboot2.3,升级到jdk21和springboot3.3 学…