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 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定义

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.xdnf.cn/news/1471.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

C++ | Leetcode C++题解之第519题随机翻转矩阵

题目&#xff1a; 题解&#xff1a; class Solution { public:Solution(int m, int n) {this->m m;this->n n;this->total m * n;srand(time(nullptr));}vector<int> flip() {int x rand() % total;vector<int> ans;total--; // 查找位置 x 对应的…

mfc | mfc集成opencv,实现摄像头监控、拍照、视频图像处理(亮度、对比度、色调、饱和度)功能

这里是引用 文章目录 一、开发环境二、MFC项目创建三、集成opencv3.1 opencv安装3.2 添加项目属性3.3 测试OpenCV&#xff08;打开摄像头&#xff09;3.4 OPENCV视频嵌入到弹框中 四、关闭摄像头、拍照功能实现4.1 添加按钮4.2 添加全局静态变量4.3 关闭摄像头功能实现4.4 拍照…

面试题:Vue生命周期

Vue生命周期 一、是什么二、Vue2生命周期三、Vue2生命周期整体流程四、Vue3生命周期 一、是什么 Vue中的实例从创建到销毁的过程就是生命周期&#xff0c;即指从创建、初始化数据、编译模板、挂载Dom→渲染、更新→渲染、卸载等一系列过程 二、Vue2生命周期 Vue2生命周期总共…

元宇宙VR展会突破传统会展局限,打造会展新生态与商业新机遇

一、身临其境感受会展新境界 元宇宙VR展会利用虚拟现实技术&#xff0c;为参会用户打造了一个高度还原的虚拟会展空间。用户只需使用手机、平板、电脑等设备&#xff0c;即可瞬间穿越至展会现场&#xff0c;仿佛置身于真实的会展环境中。 在这里&#xff0c;用户可以自由浏览…

[每周一更]-(第121期):模拟面试|微服务架构面试思路解析

这一系列针对Go面试题整理,仅供参考 文章目录 00|综合服务治理方案:怎么保证微服务应用的高可用?1. **什么是微服务架构?**2. **怎么保证微服务架构的高可用?**3. **怎么判定服务是否已经健康?**4. **如果服务不健康该怎么办?**5. **怎么判定服务已经从不健康状态恢复过…

【产品经理】工业互联网企业上市之路

树根互联2022年6月2日提交招股书之后&#xff0c;因财务资料超过六个月有效期加三个月延长期&#xff0c;2022年9月30日上市审核中止&#xff1b;2022年12月26日树根互联更新了2022年半年度财务资料&#xff0c;又九个月过去了&#xff0c;其上市进程将面临再一次中止。 处于上…

AI图像相似性搜索对比:VIT, CLIP, DINO-v2, BLIP-2

图像相似性搜索的核心在于一个简单的想法&#xff1a;图像可以表示为高维空间中的向量。当两个图像相似时&#xff0c;它们的向量应该在这个空间中占据相似的位置。我们可以通过测量角度&#xff08;或余弦相似度&#xff09;来确定这些向量的相似程度。如果角度小&#xff0c;…

AI风险及数据合规问题

一、数据来源合规问题 1、请说明发行人采集数据时是否获得了相关信息主体及用户的合法授权&#xff0c;获取用户数据的手段及方式是否合法合规; 2、请说明发行人获取用户数据及标签的过程及方法&#xff0c;是否对用户有明示提示&#xff0c;用户授权在法律上是否完备&#xff…

yoloV5实战笔记—环境搭建(一)

一、安装miniconda 从清华源进行下载 https://mirrors.tuna.tsinghua.edu.cn/ 具体命令参考&#xff0c;注意修改pip国内镜像地址 https://mirrors.tuna.tsinghua.edu.cn/help/AOSP/ 创建环境&#xff0c;指定python版本 conda create -n demo python3.9激活环境 conda acti…

Docker:存储原理

Docker&#xff1a;存储原理 镜像联合文件系统overlay镜像存储结构容器存储结构 存储卷绑定挂载存储卷结构 镜像 联合文件系统 联合文件系统Union File System是一种分层&#xff0c;轻量且高效的文件系统。其将整个文件系统分为多个层&#xff0c;层与层之间进行覆盖&#x…

【源码+文档】基于SpringBoot的养老院管理系统

作者简介&#xff1a;✌CSDN新星计划导师、Java领域优质创作者、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流。✌ 主要内容&#xff1a;&#x1f31f;Java项目、Python项目、前端项目、PHP、ASP.NET、人工智能…

LVGL UI设计神器助你高效开发嵌入式UI应用——v0.16.0发布

文章目录 Preface一、What is Anyui&#xff1f;二、Features of v0.16.0 releaseSum up Preface As coming of Internet of Things, the “screen reading” era predicted by Kevin Kelly has also arrived. Besides products like mobile phones and tablets which are PC-…

JavaFx -- chapter06(UDPSocket)

chapter06(UDPSocket) UPD的特点 UDP有独立的套接字&#xff08;IP PORT&#xff09;&#xff0c;与TCP使用相同端口号不会冲突。UDP在使用前不需要进行连接&#xff0c;没有流的概念。UDP通信类似于邮件通信&#xff1a;不需要实时连接&#xff0c;只需要目的地址。UDP通信…

爬虫学习2

数据解析 正则表达式 量词&#xff1a; import re#searcch只会匹配到第一次匹配的内容#result re.search(r"\d","今年32")#print(result.group()) #result re.findall(r"\d","我是一个abcdeafg") #print(result)#search只会匹配到第…

radio astronomy 2

地球上的电离层会被太阳风影响。

服务器作业(2)

架设一台NFS服务器&#xff0c;并按照以下要求配置 关闭防火墙 [rootlocalhost ~]# systemctl stop firewalld [rootlocalhost ~]# setenforce 0 配置文件设置&#xff1a; [rootlocalhost ~]# vim /etc/exports 1、开放/nfs/shared目录&#xff0c;供所有用户查询资料 共享…

基于MATLAB多参数结合火焰识别系统

一、课题介绍 本设计为基于MATLAB的火焰烟雾火灾检测系统。传统的采用颜色的方法&#xff0c;误识别大&#xff0c;局限性强。结合火焰是实时动态跳跃的&#xff0c;采用面积增长率&#xff0c;角点和圆形度三个维度相结合的方式判断是否有火焰。该设计测试对象为视频&#xf…

云轴科技ZStack在CID大会上分享VF网卡热迁移技术

近日&#xff0c;2024中国云计算基础架构开发者大会&#xff08;以下简称CID大会&#xff09;在北京举行。此次大会集中展示了云计算基础架构技术领域最前沿的科创成果&#xff0c;汇聚众多的技术专家和行业先锋&#xff0c;共同探讨云计算基础设施的最新发展和未来趋势。云轴科…

阿里云 K8S ACK服务 创建使用教程

目录 1.1 阿里云容器服务ACK介绍和创建 1.1.1 什么是容器服务Kubernetes版? 1.1.2 创建专有版Kubernetes集群 1.1.3 访问专有版Kubernetes集群 1.1.4 在专有版ACK集群创建资源并访问 通过百度网盘分享的文件&#xff1a;第12章-阿里云托管k8s集群ACK创建和使用 链接&…

H5测试点总结

一、概述 1.1 什么是H5 H5 即 HTML5&#xff0c;是最新的 Web 端开发语言版本&#xff0c;现如今&#xff0c;大多数手机 APP 页面会用 H5 实现&#xff0c;包括 PC Web 站点也会用它开发实现。所以 Web 的通用测试点和方法基本都可以适用于它。H5其实就是&#xff1a;移动端…