首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >组件中缺少主类的JPMS/Jigsaw

组件中缺少主类的JPMS/Jigsaw
EN

Stack Overflow用户
提问于 2017-12-19 01:12:11
回答 1查看 2.3K关注 0票数 11

我正在尝试创建一个模块化的、可执行的jar文件,该文件可以在Java9.0.1上使用java -p <jar file> -m <module>运行。

这与使用jar cfe test.jar test.Main -C classes/ .创建jar时的预期效果相同,但在使用mvn packagemvn 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与清单完全相同(请参阅下面的清单):

代码语言:javascript
复制
Manifest-Version: 1.0
Created-By: 9.0.1 (Oracle Corporation)
Main-Class: test.Main

代码语言:javascript
复制
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

代码语言:javascript
复制
$ 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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-12-19 03:47:39

不过,我在工具文档中也找不到这一点,但是工具对它的定义更好一些。

-主要班级名称 指定要在模块info.class文件中记录的主类。

我可以进一步了解JDK代码,执行不同命令时的行为似乎与mainClassModuleDescriptor.mainClass()属性有关。

因为当用--main-class标志包装jar时,应该使模块描述符中的条目在执行过程中不指定主类的完全限定名来执行模块。

另一方面,这不是真正的使用maven jar创建,并且可能在将来的升级中被修复,就像您发现的那样。

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

代码语言:javascript
复制
java -jar test-1.0.0-SNAPSHOT-jar-with-dependencies.jar

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

很明显,指定完全限定名的原因是:

代码语言:javascript
复制
java -p target/test-1.0.0-SNAPSHOT-jar-with-dependencies.jar -m test/test.Main
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47878694

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档