【发布时间】:2018-06-01 09:35:47
【问题描述】:
我正在尝试创建一个模块化的可执行 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 生成时抛出 module test does not have a MainClass attribute, use -m <module>/<main-class>。
这些 maven 生成的 jar 仍然适用于 java -p test.jar -m test/test.Main,并且所有 jar 都适用于 java -jar test.jar 的类路径。
我用jar xf test.jar检查了jar内容,发现jars完全一样,除了manifests(见下文):
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>
编辑:具有预期行为的回购:https://github.com/deontologic/test
【问题讨论】:
-
我使用的是最新的 (3.1.0) 程序集插件,但我不认为它是特定于 maven 的。通过
jar指定主类时,我似乎只能创建一个可执行jar -
如果不手动指定主类,我将无法执行 jar,除非使用 jar 的
--main-class属性。 -
@nullpointer 我添加了一个 repo,希望自述文件能阐明预期的行为。
-
是的,它们是不同的! maven 缺少 ModuleMainClass 说明符。未解决的问题在这里:issues.apache.org/jira/browse/MJAR-238 感谢您的帮助!
-
主要要了解JAR清单中的Main-Class属性是针对可执行JAR(java -jar)的,它与module-info.class中的ModuleMainClass类文件属性不是一回事.当您使用 --main-class 或 -e 选项时,jar 工具会同时设置。当清单文件包含 Main-Class 属性时,jar --manifest-file 或 -m 选项不会添加或更新 ModuleMainClass 类文件属性。
标签: java maven executable-jar java-9 module-info