簡體   English   中英

JPMS / Jigsaw缺少模塊中的主類

[英]JPMS/Jigsaw Missing Main Class in Module

我正在嘗試創建一個模塊化的可執行jar文件,可以在Java 9.0.1上使用java -p <jar file> -m <module>運行。

當使用jar cfe test.jar test.Main -C classes/ .創建jar時,這可以正常工作jar cfe test.jar test.Main -C classes/ . ,但throws module test does not have a MainClass attribute, use -m <module>/<main-class> mvn packagemvn assembly:single生成時module test does not have a MainClass attribute, use -m <module>/<main-class> mvn assembly:single

這些maven生成的jar仍然可以使用java -p test.jar -m test/test.Main ,並且所有jar都使用java -jar test.jar在類路徑上工作。


我用jar xf test.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

我不能准確地在jar工具文檔中找到它,但jmod工具定義它好一點。

 --main-class class-name 

指定要在module-info.class文件中記錄的主類。

我可以進一步研究JDK代碼和行為,因為執行不同的命令似乎與ModuleDescriptor.mainClass()mainClass屬性有關。

因為在使用--main-class標志打包jar時,應該使模塊描述符中的條目執行模塊,而不在執行期間指定主類的完全限定名。

另一方面, 使用maven jar創建並不是這樣並且可能會在您將來發現的未來升級中修復。


更多關於以下工作的原因:

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

如果指定了-jar選項,則其參數是包含應用程序的類和資源文件的JAR文件的名稱。 啟動類必須由其清單文件( META-INF/MANIFEST.MF )中的Main-Class清單頭指示。

並且很明顯為什么指定完全限定名稱的工作原理如下:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM