为何调用Blah.class.getModule()返回Unnamed Module而非BlahModule?
如何让类的
getModule()返回指定的命名模块? 要让Blah.class.getModule()返回你的BlahModule,必须满足以下几个核心条件:
1. 编译单元与模块声明正确关联
- 你的
module-info.java必须和模块内所有类的源代码处于统一的目录结构中。比如模块根目录下直接放module-info.java,类文件按包结构放在该目录下的子文件夹里。 - 编译时要将整个模块的源代码作为编译输入,不能单独编译单个类文件。例如使用
javac时,要包含module-info.java和所有模块内的类文件,而不是只编译Blah.java。
2. 用模块路径而非类路径进行编译和运行
- 编译阶段:使用
javac的--module-source-path参数指定模块源代码路径,或者直接将模块目录作为编译源,示例命令:javac -d output-dir --module-source-path src src/blahmodule/module-info.java src/blahmodule/com/example/Blah.java - 运行阶段:必须通过模块路径加载模块,而不是把类文件放到类路径。示例启动命令:
如果把类文件放到类路径运行,即使有java --module-path output-dir --module blahmodule/com.example.YourMainClassmodule-info.class,类也会被归到未命名模块。
3. 保证模块声明的可观察性
根据Java语言规范7.2的描述,模块与编译单元的关联取决于模块声明的可观察性,具体来说:
- 编译时,编译器必须能找到
module-info.java,不能把它排除在编译范围外。 - 运行时,包含
module-info.class的模块目录或Jar包必须在模块路径上,让JVM能识别到这是一个命名模块。
4. 禁止单独加载模块内的类
如果只单独编译Blah.java(不编译module-info.java),或者运行时只将Blah.class放到类路径,这个类会被JVM判定为未关联命名模块的编译单元,从而归到未命名模块(符合Java语言规范7.7.5的描述)。必须确保整个模块的字节码(包括module-info.class)一起通过模块路径加载。
内容的提问来源于stack exchange,提问作者davidalayachew
相关产品推荐
相关产品推荐

