JPMS/Jigsaw缺少模块中的主类

kan*_*ics 7 java executable-jar maven java-9 module-info

我正在尝试创建一个模块化的可执行jar文件,可以java -p <jar file> -m <module>在Java 9.0.1上运行.

当使用和生成jar时jar cfe test.jar test.Main -C classes/ .,这可以正常工作,但是module test does not have a MainClass attribute, use -m <module>/<main-class>在使用mvn package和生成时抛出mvn assembly:single.

这些maven生成的jar仍然可以使用java -p test.jar -m test/test.Main,并且所有jar都在classpath上工作java -jar test.jar.


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

Manifest-Version: 1.0
Created-By: 9.0.1 (Oracle Corporation)
Main-Class: test.Main
Run Code Online (Sandbox Code Playgroud)

Manifest-Version: 1.0
Archiver-Version: Plexus Archiver
Created-By: Apache Maven
Built-By: testuser
Build-Jdk: 9.0.1
Main-Class: test.Main
Run Code Online (Sandbox Code Playgroud)

值得注意的是,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>
Run Code Online (Sandbox Code Playgroud)

编辑:具有预期行为的回购: https: //github.com/deontologic/test

Nam*_*man 6

我也无法在jar工具文档中准确地找到它,但该jmod工具对其进行了更好的定义。

--main-class class-name 
Run Code Online (Sandbox Code Playgroud)

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

我可以深入了解一下JDK代码和行为,你执行与不同的命令似乎mainClass的属性ModuleDescriptor.mainClass()

因为在用--main-classflag打包jar的时候,模块描述符中的条目应该是在执行模块时不指定主类的全限定名来执行模块的。

另一方面,这不是使用 Maven jar 创建的真实情况并且可能会在您发现的未来升级中修复。


更多关于为什么以下工作:

java -jar test-1.0.0-SNAPSHOT-jar-with-dependencies.jar
Run Code Online (Sandbox Code Playgroud)

如果-jar指定了该选项,则其参数是包含应用程序类和资源文件的 JAR 文件的名称。启动类必须Main-Class由其清单文件中的清单头指示(META-INF/MANIFEST.MF

很明显,为什么指定完全限定名称的作用如下:

java -p target/test-1.0.0-SNAPSHOT-jar-with-dependencies.jar -m test/test.Main
Run Code Online (Sandbox Code Playgroud)