当前位置: 首页 > article >正文

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-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 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》


http://www.kler.cn/a/386160.html

相关文章:

  • <AI 学习> 下载 Stable Diffusions via Windows OS
  • sql在按照当前表查询返回
  • 蓝桥杯竞赛单片机组备赛【经验帖】
  • SQL面试题——蚂蚁SQL面试题 连续3天减少碳排放量不低于100的用户
  • 提高数据处理效率:JavaScript 操作 XLSX 文件的最佳实践
  • 《Python Web 抓取实战:豆瓣电影 Top 250 数据抓取与分析》
  • QML项目实战:自定义Button
  • Spring面试题之事务的传播行为
  • electron 中 ipcRendererEvent 作用
  • 面试总结!
  • spark的学习-03
  • YOLOv8相较于YOLOv5有哪些改进?
  • 滑动窗口最大值
  • 《手写Spring渐进式源码实践》实践笔记(第十七章 数据类型转换)
  • 布朗运动
  • 如何用全局事件总线实现组件间的通信
  • STM32标准库-待机模式
  • 数据集市是什么?有什么优势?
  • OpenGL学习笔记(三) 绘制图形
  • RabbitMQ 篇-深入了解 RabbitMQ 安装以及 SpringAMQP 的基础使用(声明队列和交换机、发送接收消息、配置 JSON 消息转化器)
  • 【Linux系列】利用 CURL 发送 POST 请求
  • Android13 系统/用户证书安装相关分析总结(二) 如何增加一个安装系统证书的接口
  • 网络协议都有哪些?
  • 软件工程技术专业在物联网应用开发中的关键技术与挑战
  • XSS详解
  • 【Rust设计模式之Fold模式】