Java 11下自定义java.util包类编译失败问题求助
解决Java 11中自定义java.util类编译及引导加载问题
问题原因
Java 9引入模块化系统后,java.util属于核心模块java.base,编译器禁止普通代码直接向已存在的系统模块包中添加类,这就是你碰到「package exists in another module: java.base」错误的原因。你之前用的--patch-module参数格式不对,导致没生效。
正确配置步骤
1. 直接用javac编译
编译时要指定补丁模块的根目录(不是包名),命令示例:
javac --patch-module java.base=./src/main/java -d ./out java/util/YourCustomClass.java
--patch-module java.base=./src/main/java:这里的路径是包含java/util目录的根目录,不是java.util包名-d ./out:指定编译后的类文件输出目录- 最后是你的自定义类的完整路径
2. Maven项目配置
如果用Maven,修改pom.xml里的编译器插件,添加正确的--patch-module参数:
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.1</version> <configuration> <release>11</release> <compilerArgs> <arg>--patch-module</arg> <arg>java.base=${project.basedir}/src/main/java</arg> </compilerArgs> </configuration> </plugin> </plugins> </build>
这样Maven编译时会自动应用补丁模块参数,解决包冲突问题。
3. 运行阶段配置
启动程序时同样需要指定补丁路径,确保JVM加载你的自定义类:
java --patch-module java.base=./out your.main.EntryClass
4. 打包成可引导加载的补丁JAR(可选)
如果要把自定义类打包成可复用的补丁包,执行以下命令:
jar --create --file java-base-patch.jar -C ./out java
启动时用这个JAR作为补丁:
java --patch-module java.base=java-base-patch.jar your.main.EntryClass
关键注意点
- 你之前错误地把
java.util作为路径传给--patch-module,实际需要传的是包含java/util目录的根文件夹路径 - Java 11中
rt.jar已经被拆分为模块化的jmod文件,不能直接修改,通过--patch-module是官方推荐的向核心模块添加类的方式 - 这种方式属于对JDK核心模块的修改,要注意避免和JDK内部类冲突,测试时要确保兼容性
内容的提问来源于stack exchange,提问作者V R
相关产品推荐
相关产品推荐

