You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 11:14:51