Java9模块系统常见错误
官方Jigsaw模块系统文档
java命令,具体可用参数使用 java --help
。
用法:java [options] <主类> [args...]
(执行类)
或 java [options] -jar <jar 文件> [args...]
(执行 jar 文件)
或 java [options] -m <模块>[/<主类>] [args...]
java [options] --module <模块>[/<主类>] [args...]
(执行模块中的主类)
或 java [options] <源文件> [args]
(执行单个源文件程序)
将主类、源文件、-jar <jar 文件>、-m 或
--module <模块>/<主类> 后的参数作为参数
传递到主类。
Error occurred during initialization of boot layer. java.lang.module.FindException: Module com.greetings\com.greetings.Main not found
众所周知,使用java执行模块里的入口类的命令是:java -m 模块/包名.主类
。
这样运行java --module-path mods -m com.greetings\com.greetings.Main2
会导致如下错误;
错误的原因那就是反斜杠(\)更改为正斜杠(/)。
还需要注意-m参数模块名后面是包结构,可不是目录结构,需要注意。表现形式为:-m 模块名/包名.主类
Error occurred during initialization of boot layer
java.lang.module.FindException: Module com.greetings\com.greetings.Main not found
对 javac --module-path mods -d mods\com.greetings com\greetings\Main.java com\greetings\module-info.java
命令的组织枚举
--module-path:指定搜索模块目录的路径,这个路径下一级的目录需要都是模块目录(JDK9的模块)。
-d 指定生成的class放在哪个目录里面,通常指定mods\模块目录。注意了,这里指定的是放置的位置。
-d mods\xxx.xxx 这里的目录名不需要跟模块名称同名,只是方便组织所以同名了,
当你通过java命令调用的时候,-m参数的后面是模块名称,而不是这个目录名称,切记。
后面的就是待生成class的源文件了。
可以使用java --module-path mods --list-modules
可以看到mods下都有哪些模块。
只有module-info.java文件内容的module后面的标识符是模块名称。
module 模块名称 {}