Java 模块中缺少JPMS/Jigsaw主类

Java 模块中缺少JPMS/Jigsaw主类,java,maven,executable-jar,java-9,module-info,Java,Maven,Executable Jar,Java 9,Module Info,我试图创建一个模块化的、可执行的jar文件,它可以在Java9.0.1上使用java-p-m运行 当使用jar cfe test.jar test.Main-C classes/创建jar时,这与预期一样有效,但抛出的模块测试没有MainClass属性,当使用mvn包和mvn程序集:single生成时,请使用-m/ 这些maven生成的jar仍然使用java-p test.jar-m test/test.Main,所有jar都使用java-jar test.jar在类路径上工作 我用jar x

我试图创建一个模块化的、可执行的jar文件,它可以在Java9.0.1上使用
java-p-m
运行

当使用
jar cfe test.jar test.Main-C classes/
创建jar时,这与预期一样有效,但抛出的
模块测试没有MainClass属性,当使用
mvn包和
mvn程序集:single
生成时,请使用-m/

这些maven生成的jar仍然使用
java-p test.jar-m test/test.Main
,所有jar都使用
java-jar test.jar
在类路径上工作


我用
jar xf test.jar
检查了jar内容,发现除了清单之外,jar完全相同(见下文):

值得注意的是,在指定工作清单时,仍然不能使用
java-p test.jar-m test

$ jar cfm test.jar test-contents/META-INF/MANIFEST.MF -C classes/ .
$ java -p test.jar -m test

module test does not have a MainClass attribute, use -m <module>/<main-class>
$jar cfm test.jar test contents/META-INF/MANIFEST.MF-C classes/。
$java-p test.jar-m test
模块测试没有MainClass属性,请使用-m/

编辑:具有预期行为的回购:

虽然我也无法在文档中准确地找到这一点,但它的定义要好一点

指定要记录在module-info.class文件中的主类

我可以进一步研究JDK代码,执行不同命令时的行为似乎与

因为在使用
--main class
标志打包jar时,应该在模块描述符中输入执行模块,而不必在执行期间指定主类的完全限定名

另一方面,这是不正确的,并且可能会在您发现的未来升级中修复


更多关于以下工作原理的信息:

java -jar test-1.0.0-SNAPSHOT-jar-with-dependencies.jar
如果指定了
-jar
选项,则其参数是包含应用程序的类和资源文件的jar文件的名称。启动类必须由其清单文件(
META-INF/manifest.MF
)中的
主类
清单头指示

很明显,指定完全限定名称的工作原理如下:

java -p target/test-1.0.0-SNAPSHOT-jar-with-dependencies.jar -m test/test.Main

我正在使用最新的(3.1.0)汇编插件,但我不认为它是特定于maven的。我似乎只能在通过
jar
指定主类时创建一个可执行的jar,如果不手动指定主类,我就无法执行jar,除非使用jar的
--main class
属性。@nullpointer我添加了一个repo,希望自述文件澄清了预期的行为。是的,他们是不同的!maven one缺少ModuleMalClass说明符。开放的问题在这里:谢谢你的帮助!需要了解的主要内容是JAR清单中的main Class属性是用于可执行JAR(java-JAR)的,它与module-info.Class中的ModuleMainClass Class文件属性不同。当您使用--main类或-e选项时,jar工具会同时设置这两个选项。当清单文件包含主类属性时,jar--manifest file或-m选项不会添加或更新ModuleMainClass类文件属性。
--main-class class-name 
java -jar test-1.0.0-SNAPSHOT-jar-with-dependencies.jar
java -p target/test-1.0.0-SNAPSHOT-jar-with-dependencies.jar -m test/test.Main