簡體   English   中英

無法為Eclipse項目創建可運行的jar

[英]Not able to create runnable jar for eclipse project

我在Eclipse中創建了小型Java應用程序。 從IDE創建可運行的jar時,一切工作正常。 但是以某種方式我無法通過終端創建它(僅供參考,我使用Mac)。

以下是我的項目目錄結構

./bin (Contains all compiled classes)
./lib (Contains all the third party lib I am using lib1.jar,lib2.jr, lib3.jar)
./src (Contains my java class = myProject.java)
manifest.txt (Contains 2 line, first line is Main-Class:myProject and second line is empty)

以下是我用於編譯類的命令

javac -d bin -sourcepath src -cp lib/lib1.jar:lib/lib2.jar:lib/lib3.jar src/myProject.java

要創建jar文件,我正在使用以下命令

jar cvfm myProject.jar manifest.txt bin/*.class lib/*.jar

當我運行此命令時,我得到的標題字段無效。 以下是完整的錯誤消息。

java.io.IOException: invalid header field
    at java.util.jar.Attributes.read(Attributes.java:393)
    at java.util.jar.Manifest.read(Manifest.java:180)
    at java.util.jar.Manifest.<init>(Manifest.java:50)
    at sun.tools.jar.Main.run(Main.java:149)
    at sun.tools.jar.Main.main(Main.java:1147)

我不確定我要去哪里錯。 誰能指出我在犯什么錯誤,還是我需要更多的東西?

提前致謝。

JAR文件規范可以在這里提供幫助。

我認為“無效標頭字段”消息背后的問題是標頭字段的值必須以空格開頭; 嘗試manifest.txt包含

Main-Class: myProject

代替。

至於訪問lib/*.jar文件中的類,Java不會在jar文件內的jar文件中找到類-您實際上可以跳過在jar命令行上指定lib/*.jar的方法。

這有兩種可能性:

  •  Class-Path: lib/lib1.jar lib/lib2.jar lib/lib3.jar 

    manifest.txt 這樣做的缺點是,如果您分發jar且庫jar不在正確的相對路徑上,則會出現ClassNotFoundError。

  • lib/*.jar內部將所有.class文件解壓縮到一個臨時目錄中,並將它們添加到myProject.jar 這樣做的好處是罐子是完全獨立的。 缺點是它是一個較大的文件,較復雜,創建時間也較長。 您可以按照以下方式使用shell腳本:

     mkdir lib/expanded cd lib/expanded for J in ../*.jar; do unzip "${J}" rm -rf META-INF done zip -R ../../myProject.jar * cd .. && rm -rf expanded 

    提取每個lib/*.jar文件后,將刪除META-INF目錄,以便unzip不會詢問是否要覆蓋,並且它也不會覆蓋myProject.jar的清單。

仔細閱讀jar文件,我想您可以嘗試如下操作:

jar cvmfe manifest.txt myProjecy.jar myProject bin/*.class lib/*.jar

其中myProject是您的輸入類別名稱。 如果那不起作用,請嘗試完全刪除-m選項和manifest.txt ,我想-e選項還是應該占用MainClass條目。

暫無
暫無

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

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