gpt4 book ai didi

java - JPMS/Jigsaw 在模块中缺少主类

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:29:28 29 4
gpt4 key购买 nike

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

这在使用 jar cfe test.jar test.Main -C classes/ . 创建 jar 时按预期工作, 但抛出 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 都在类路径上使用 java -jar test.jar .


我用 jar xf test.jar 检查了 jar 内容,发现除了 list (见下文)外, 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指定工作 list 时:

$ 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 tool 中找不到这个准确的文档,但 jmod tool定义好一点。

--main-class class-name 

Specifies main class to record in the module-info.class file.

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

因为在用--main-class标志打包jar时,模块描述符中的条目应该被设置为执行模块而不指定主类的完全限定名称在执行期间。

另一方面,这不是真的using the maven jar creation并且可能会在您发现的 future 升级中得到修复。


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

java -jar test-1.0.0-SNAPSHOT-jar-with-dependencies.jar

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

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

java -p target/test-1.0.0-SNAPSHOT-jar-with-dependencies.jar -m test/test.Main

关于java - JPMS/Jigsaw 在模块中缺少主类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47878694/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com