我正在尝试创建一个可执行的模块化 jar 文件,可以在 Java 9.0.1 上使用 java -p <jar file> -m <module>
命令运行。
当使用jar cfe test.jar test.Main -C classes/ .
命令创建jar文件时,这个目标可以达成,但是使用mvn package
和mvn assembly:single
命令生成的jar文件会抛出错误:module test does not have a MainClass attribute, use -m <module>/<main-class>
。
即使是由 maven 生成的这些 jar 文件,在 classpath 中也能够用 java -jar test.jar
命令正常工作,同时也可以通过 java -p test.jar -m test/test.Main
命令实现相同的效果。
我使用jar xf test.jar
命令检查了 jar 文件的内容,并发现除了清单(manifest)之外,这些 jar 文件完全相同(见下文):
Manifest-Version: 1.0
Created-By: 9.0.1 (Oracle Corporation)
Main-Class: test.Main
和
Manifest-Version: 1.0
Archiver-Version: Plexus Archiver
Created-By: Apache Maven
Built-By: testuser
Build-Jdk: 9.0.1
Main-Class: test.Main
值得注意的是,在指定工作清单时仍无法使用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>
编辑: 一个具有预期行为的repo:https://github.com/deontologic/test
jar --main-class
时它可以正常工作。 - kantianethics