命令行运行Java模块调换-p与-m参数顺序执行失败是否为预期行为?
结论
这是预期内的设计行为,-p和-m的参数顺序确实会直接影响运行结果。
原因解释
Java启动器的参数有严格的位置规则,官方定义的命令语法如下:
java [JVM选项] <主类名> [应用程序参数...] java [JVM选项] -m <模块名>[/<主类名>] [应用程序参数...]
其中:
- 所有JVM层面的配置(包括
-p/--module-path模块路径配置、-cp/-classpath类路径配置、-X/-XX开头的虚拟机参数等),必须全部放在-m参数或者主类名之前,才会被JVM识别生效。 - 所有跟在
-m参数(及指定的模块名)之后的内容,都会被JVM判定为传递给应用主类的程序入参,不会被解析为JVM配置。
你把-p放到-m后面时,JVM解析到-m my.module.name就已经结束了JVM参数的读取,此时还没有加载你指定的模块路径,自然找不到对应模块,就会抛出Module my.module.name not found错误,而后面的-p "dir/with/module1;dir/with/module2"只会被传入主类的main方法的args数组中,不会起到配置模块路径的作用。
补充说明
所有JVM专属参数都必须放在主类/模块声明之前,不要和应用参数混放,否则都会出现不生效的问题。
内容的提问来源于stack exchange,提问作者JellyRaptor
相关产品推荐
相关产品推荐

