我正在尝试创建一个模块化的、可执行的jar文件,该文件可以在Java9.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生成的jars仍然可以使用java -p test.jar -m test/test.Main,所有的jars都在使用java -jar test.jar的类路径上工作。
我使用jar xf test.jar检查了jar内容,发现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>编辑:具有预期行为的回购:https://github.com/deontologic/test
发布于 2017-12-19 03:47:39
不过,我在工具文档中也找不到这一点,但是工具对它的定义更好一些。
-主要班级名称 指定要在模块info.class文件中记录的主类。
我可以进一步了解JDK代码,执行不同命令时的行为似乎与mainClass的ModuleDescriptor.mainClass()属性有关。
因为当用--main-class标志包装jar时,应该使模块描述符中的条目在执行过程中不指定主类的完全限定名来执行模块。
另一方面,这不是真正的使用maven jar创建,并且可能在将来的升级中被修复,就像您发现的那样。
更多关于以下工作原因的信息:
java -jar test-1.0.0-SNAPSHOT-jar-with-dependencies.jar如果指定了-jar选项,则其参数是包含应用程序类和资源文件的JAR文件的名称。启动类必须由Main-Class清单头在其清单文件(META-INF/MANIFEST.MF)中指示。
很明显,指定完全限定名的原因是:
java -p target/test-1.0.0-SNAPSHOT-jar-with-dependencies.jar -m test/test.Mainhttps://stackoverflow.com/questions/47878694
复制相似问题