[英]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 package
和mvn 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.