2017-03-25 162 views
0

在使用命令行編譯Java jar文件時遇到一些技術問題。無法執行jar文件

我在同一個目錄中這兩個.java文件

// Source.java

package home; 

public class Source { 

    public Source(){ 
    System.out.println("This is the source."); 
    } 

    public static void main(String[] s){ 
    System.out.println("this is England."); 
    System.out.println("ok 1 - Input file close"); 
    new Source(); 
    new Other(); 
    System.exit(3); 
    } 

} 

// Other.java

package home; 

public class Other { 

    public Other(){ 
    System.out.println("More source here."); 
    } 


} 

我這兩個文件編譯成.jar文件,如下所示:

#!/usr/bin/env bash 

javac $(dirname "$0")/*.java 
jar cmf MyJar.jar Manifest.txt *.class 

的Manifest.txt文件只包含以下三行:

Manifest-Version: 1.0 
    Created-By: <Your info> 
    Main-Class: home.Source 

然而,當我嘗試執行jar文件:

#!/usr/bin/env bash 
java -jar MyJar.jar 

我得到這個錯誤:

Error: Could not find or load main class home.Source 

我不知道現在該做什麼。有人知道什麼是錯的?也許我正在使用錯誤的命令來生成.jar文件?

作爲檢查,我跑jar tf

bash-3.2$ jar tf MyJar.jar 
META-INF/ 
META-INF/MANIFEST.MF 
Other.class 
Source.class 
+1

你可以執行'jar tf MyJar.jar'並確認清單確實在罐子裏和正確的路徑中嗎? –

+0

[無法執行jar文件:「無主清單屬性」]的可能重複(http://stackoverflow.com/questions/9689793/cant-execute-jar-file-no-main-manifest-attribute) – Omore

+1

我只是在這裏閱讀http:// stackoverflow。com/a/17097535/3858121您可能需要在清單文件後面添加一個空行,否則它將無法正確解析 –

回答

1

的問題是,你的類是在一個包,並在jar文件應該是一個目錄中 - 這是在錯誤信息進行編碼:注意「class home.Source」 - java將在一個名爲home的目錄中查找Source類,無論是本地目錄還是jar中的目錄(所有這些目錄都必須位於classpath中 - 可執行jar的內容會自動添加)。 。

當使用javac建議指定與-d標誌的目標輸出目錄,因爲這樣做將創建的類在任何軟件包的目錄結構

如:

javac -d bin/ $(dirname "$0")/*.java 
jar cmf MyJar.jar Manifest.txt -C bin/ * 

-C標誌將目錄更改爲包含輸出包結構的bin/目錄,並且*包含所有內容(當然,您可以在此處使用home/*.class或其他任何可以從中返回完整相對路徑新的CWD到目標類文件)。

或者,您可以自己將類移動到相關的目錄,或者在那裏編譯它們,但通常情況下最好讓javac根據源代碼中的包聲明來執行它。

最後,考慮使用gradle,maven甚至ant來構建您的項目,因爲它們都旨在避免此類問題。

+0

jar -cvmf而不是jar -cvmf - 這些都是一樣的 –

+0

謝謝,試圖回答使用移動設備和犯了一個錯字。 –

+0

np!謝謝,我做了這個改變,現在我得到了模糊的錯誤:java.io.IOException:在java.util.jar.Manifest處的java.util.jar.Attributes.read(Attributes.java:410) 處的無效標頭字段 .read(Manifest.java:199) at java.util.jar.Manifest。(Manifest.java:69) at sun.tools.jar.Main.run(Main.java:176) at sun.tools.jar.Main.main(Main.java:1288) –