Java8升Java11 Maven编译报错:java.util包多模块可访问
解决Java 11升级后AJC编译的包冲突问题
问题原因
Java 9引入模块系统后,java.util属于java.base核心模块。出现这个错误是因为AJC编译器同时从未命名模块(类路径下的JAR/代码)和java.base模块中找到了java.util包,导致冲突。
解决步骤
1. 升级AspectJ相关组件版本
你当前使用的com.nickwongdev:aspectj-maven-plugin:1.12.6对Java 11支持不足,先升级插件及依赖的AspectJ版本:
- 将插件版本升级到
1.14.0(或更高兼容Java 11的版本) - 确保
aspectjrt和aspectjtools的版本为1.9.8及以上(该版本开始全面支持Java 11)
示例插件配置:
<plugin> <groupId>com.nickwongdev</groupId> <artifactId>aspectj-maven-plugin</artifactId> <version>1.14.0</version> <dependencies> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjrt</artifactId> <version>1.9.8</version> </dependency> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjtools</artifactId> <version>1.9.8</version> </dependency> </dependencies> <configuration> <source>11</source> <target>11</target> <complianceLevel>11</complianceLevel> <ajcArguments> <arg>--release</arg> <arg>11</arg> </ajcArguments> </configuration> <executions> <execution> <goals> <goal>compile</goal> <goal>test-compile</goal> </goals> </execution> </executions> </plugin>
2. 排查依赖中的冲突JAR
检查项目依赖是否包含了非法打包JDK类的第三方库:
- 执行
mvn dependency:tree生成依赖树,找出可疑的老旧依赖 - 对可疑JAR执行
jar tf <jar文件名>,查看是否包含java/util/路径下的类 - 若找到此类依赖,要么升级到兼容Java 11的版本,要么通过
<exclusions>排除掉冲突部分
3. 检查项目代码结构
确认自身代码没有违规创建java.util包:
- 检查
module-1下的所有代码,确保没有在java.util包下编写自定义类或放置资源文件 - 若存在此类代码,立即修改包名(JDK核心包不允许用户自定义类)
4. 同步Maven编译器配置
确保maven-compiler-plugin也配置为Java 11:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.1</version> <configuration> <source>11</source> <target>11</target> <release>11</release> </configuration> </plugin>
内容的提问来源于stack exchange,提问作者Mohit Kumar
相关产品推荐
相关产品推荐

