Java 9运行Hello World报错:启动层初始化失败,模块未找到
遇到这个错误,大概率是模块的目录结构、编译输出或者命令参数出了问题,我给你一步步拆解排查和解决的方法:
1. 先确认模块的核心结构是否正确
Java 9的模块系统对目录结构有严格要求:模块的根目录必须直接包含module-info.class,同时该目录下要有对应包结构的.class文件。
举个正确的例子,假设你的工作目录是project(也就是你执行命令的那个bin的父目录),正确的bin目录结构应该是下面两种之一:
情况一:bin直接作为模块根目录
project/ └── bin/ ├── module-info.class # 必须在bin根目录下 └── com/ └── pantech/ └── myModule/ └── HelloWorld.class
情况二:bin下包含模块名子目录(模块根目录是子目录)
project/ └── bin/ └── com.pantech.myModule/ # 这是模块根目录 ├── module-info.class └── com/ └── pantech/ └── myModule/ └── HelloWorld.class
你的命令java --module-path bin -m com.pantech.myModule/com.pantech.myModule.HelloWorld是从project目录执行的,所以要确保bin目录下的结构符合上面任意一种。
2. 检查模块声明是否匹配
打开你的module-info.java,确认第一行的模块名和命令里的完全一致,包括大小写:
module com.pantech.myModule { // 如果HelloWorld是主类,至少要确保模块声明正确,需要导出包的话加 exports com.pantech.myModule; }
如果这里写成了com.pantech.mymodule(小写m),命令里用大写的话肯定找不到模块。
3. 验证编译是否生成了正确的结构
如果编译命令不对,也会导致.class文件位置错误。比如你用javac编译时,要确保用-d参数指定输出目录为bin,并且把所有源文件都包含进去:
假设你的源代码在src目录下(对应情况一的结构),编译命令应该是:
javac -d bin src/module-info.java src/com/pantech/myModule/HelloWorld.java
这样编译后,bin目录下会直接生成module-info.class和对应的包结构。
4. 用命令验证模块是否能被识别
在project目录下执行这条命令,看看bin路径下能找到哪些模块:
java --list-modules --module-path bin
如果输出里没有com.pantech.myModule,说明模块路径下确实找不到这个模块,回到第一步检查目录结构。
5. 确认主类的全限定名正确
确保HelloWorld类的开头有正确的包声明:
package com.pantech.myModule; public class HelloWorld { public static void main(String[] args) { System.out.println("Hello World"); } }
命令里的com.pantech.myModule.HelloWorld必须和这个全限定名完全一致。
按照上面的步骤逐一排查,基本上就能解决模块找不到的问题了。
内容的提问来源于stack exchange,提问作者D. Pante

