Java 9多模块环境下类修补方法及模块描述文件配置疑问
关于JDK模块修补的目录结构与编译指南
嘿,我来帮你梳理下这个JDK模块修补的问题!你现在修改了Object.java和FileHandler.java,还创建了空的模块描述文件,这里确实有几个关键点需要调整,咱们一步步说:
一、先纠正:空的module-info.java不可取
首先明确:空的模块描述文件是错误的做法。JDK的模块系统是强封装的,每个模块的module-info.java必须准确声明模块的依赖关系、导出包、服务提供等核心信息,否则编译时会直接抛出模块相关的错误,甚至连基础的类引用都无法解析。
正确的做法是:
- 从JDK官方源码中复制对应模块的原始
module-info.java内容(比如java.base和java.logging的模块声明) - 如果你的修改没有涉及模块结构的变更(只是修改类逻辑),直接复用原声明即可;如果有特殊需求(比如新增导出包),再针对性调整。
举个例子,java.base的module-info.java至少要包含对核心包的导出(比如exports java.lang;,因为Object属于这个包),而java.logging的module-info.java必须声明对java.base的依赖(requires java.base;),否则编译FileHandler.java时会找不到Object类。
二、推荐的目录结构
为了和JDK源码结构保持一致,方便编译和维护,建议你用如下目录结构:
├── java.base/ │ ├── module-info.java # 基于JDK原始文件,非空 │ └── java/ │ └── lang/ │ └── Object.java # 你修改后的版本 └── java.logging/ ├── module-info.java # 基于JDK原始文件,声明依赖java.base └── java/ └── util/ └── logging/ └── FileHandler.java # 你修改后的版本
三、编译时确保使用本地修改的Object.java
要让FileHandler.java编译时优先使用你修改的Object.java,而不是系统JDK自带的版本,需要通过javac的模块参数来指定依赖路径:
- 先编译修改后的
java.base模块:
javac -d ./output/java.base java.base/module-info.java java.base/java/lang/Object.java
这里./output/java.base是编译后字节码的输出目录,你可以根据自己的需求调整路径。
- 再编译
java.logging模块,指定依赖本地编译的java.base:
javac --module-path ./output -d ./output/java.logging java.logging/module-info.java java.logging/java/util/logging/FileHandler.java
--module-path ./output会告诉编译器在output目录下查找依赖模块,这样就会优先加载你修改后的java.base,而不是系统默认的JDK模块。
四、常见坑点提示
- 如果编译时出现“找不到符号”或模块相关错误,先检查
module-info.java的声明是否和原JDK模块一致,尤其是依赖和导出包的配置。 - 尽量不要随意修改模块的封装规则(比如新增导出包),否则可能导致后续运行时出现兼容性问题,除非你明确知道自己在做什么。
内容的提问来源于stack exchange,提问作者Gayan Weerakutti
相关产品推荐
相关产品推荐

