2011-07-25 83 views
4

我正在嘗試從命令行創建可執行jar。 JAR中的主類具有依賴關係,我已將其打包到另一個純JAR文件中。從命令行用可執行JAR(ÜberJAR)捆綁JAR依賴關係

我想將依賴JAR與可執行JAR一起打包,以便發佈單個JAR文件。

我有什麼到目前爲止已經試過如下:

的依賴Hello.class文件具有模擬代碼:

public class Hello { 
    public String getHello() { 
     return "Well hello there!!"; 
    } 
} 

我已經打包類文件到hello.jar使用:

jar cvfM hello.jar Hello.class 

hello.jar內容現在是:

hello.jar -+- Hello.class 

現在我與模擬代碼的主類:

public class Main { 
    public static void main(String[] args) { 
     System.out.println(new Hello().getHello()); 
    } 
} 

我然後創建一個清單文件manifest.txt具有以下內容:

Main-Class: Main 
Class-Path: hello.jar 

我現在創建可執行JAR使用:

jar cvfm main.jar manifest.txt Main.class hello.jar 

main.jar文件內容現在是:

main.jar -+- Main.class 
      | 
      +- hello.jar 
      | 
      +- META-INF -+- MANIFEST.MF 

運行使用可執行的JAR:

java -jar main.jar 

我得到了你好類相關性的類加載器的錯誤。我知道這是因爲類加載器尋找hello.jarmain.jar相同。所以當我把的副本hello.jar並列main.jar我能夠運行它。

我需要做什麼才能運行main.jar其中帶有hello.jar?

我知道你會問:「他爲什麼試圖這樣做?」。我知道,大多數人使用Eclipse,Ant,Maven或其他工具來執行此操作。但請只是幽默我:)

回答

0

有沒有簡單的方法來做到這一點。也就是說,如果你想在罐子裏放入罐子,你將不得不編寫自己的類加載器。

有幾種產品已經爲您提供支持。 One-Jar是我使用過很多成功的產品之一 - 可以很容易地編寫腳本。

這裏有一個有趣等全專題討論 -

Easiest way to merge a release into one JAR file

4

不幸的是你的方法是完全錯誤的。 沒有「正常」的方式來放置另一個罐子裏面的罐子。所以你的hello.jar在main.jar中沒有任何內容!關鍵是「正常」類加載器不會在jar文件中查找jar文件,因此您會得到類未找到的錯誤。 但是:如果你想絕望地做到這一點,那麼谷歌的「OneJar」,並去http://one-jar.sourceforge.net/