2008-09-17 76 views
70

是否有工具或腳本可以輕鬆地將一堆JAR文件合併到一個JAR文件中?一個好處是可以輕鬆設置主文件清單並使其可執行。將發佈合併到一個JAR文件中的最簡單方法

具體案例是Java restructured text tool。我想的東西,如運行:

Java的罐子rst.jar

據我所知,它沒有依賴這表明它不應該是一個簡單的單文件工具,但下載的ZIP文件包含很多庫。

 0 11-30-07 10:01 jrst-0.8.1/ 
    922 11-30-07 09:53 jrst-0.8.1/jrst.bat 
    898 11-30-07 09:53 jrst-0.8.1/jrst.sh 
    2675 11-30-07 09:42 jrst-0.8.1/readmeEN.txt 
108821 11-30-07 09:59 jrst-0.8.1/jrst-0.8.1.jar 
    2675 11-30-07 09:42 jrst-0.8.1/readme.txt 
     0 11-30-07 10:01 jrst-0.8.1/lib/ 
    81508 11-30-07 09:49 jrst-0.8.1/lib/batik-util-1.6-1.jar 
2450757 11-30-07 09:49 jrst-0.8.1/lib/icu4j-2.6.1.jar 
559366 11-30-07 09:49 jrst-0.8.1/lib/commons-collections-3.1.jar 
    83613 11-30-07 09:49 jrst-0.8.1/lib/commons-io-1.3.1.jar 
207723 11-30-07 09:49 jrst-0.8.1/lib/commons-lang-2.1.jar 
    52915 11-30-07 09:49 jrst-0.8.1/lib/commons-logging-1.1.jar 
260172 11-30-07 09:49 jrst-0.8.1/lib/commons-primitives-1.0.jar 
313898 11-30-07 09:49 jrst-0.8.1/lib/dom4j-1.6.1.jar 
1994150 11-30-07 09:49 jrst-0.8.1/lib/fop-0.93-jdk15.jar 
    55147 11-30-07 09:49 jrst-0.8.1/lib/activation-1.0.2.jar 
355030 11-30-07 09:49 jrst-0.8.1/lib/mail-1.3.3.jar 
    77977 11-30-07 09:49 jrst-0.8.1/lib/servlet-api-2.3.jar 
226915 11-30-07 09:49 jrst-0.8.1/lib/jaxen-1.1.1.jar 
153253 11-30-07 09:49 jrst-0.8.1/lib/jdom-1.0.jar 
    50789 11-30-07 09:49 jrst-0.8.1/lib/jewelcli-0.41.jar 
324952 11-30-07 09:49 jrst-0.8.1/lib/looks-1.2.2.jar 
121070 11-30-07 09:49 jrst-0.8.1/lib/junit-3.8.1.jar 
358085 11-30-07 09:49 jrst-0.8.1/lib/log4j-1.2.12.jar 
    72150 11-30-07 09:49 jrst-0.8.1/lib/logkit-1.0.1.jar 
342897 11-30-07 09:49 jrst-0.8.1/lib/lutinwidget-0.9.jar 
2160934 11-30-07 09:49 jrst-0.8.1/lib/docbook-xsl-nwalsh-1.71.1.jar 
301249 11-30-07 09:49 jrst-0.8.1/lib/xmlgraphics-commons-1.1.jar 
    68610 11-30-07 09:49 jrst-0.8.1/lib/sdoc-0.5.0-beta.jar 
3149655 11-30-07 09:49 jrst-0.8.1/lib/xalan-2.6.0.jar 
1010675 11-30-07 09:49 jrst-0.8.1/lib/xercesImpl-2.6.2.jar 
194205 11-30-07 09:49 jrst-0.8.1/lib/xml-apis-1.3.02.jar 
    78440 11-30-07 09:49 jrst-0.8.1/lib/xmlParserAPIs-2.0.2.jar 
    86249 11-30-07 09:49 jrst-0.8.1/lib/xmlunit-1.1.jar 
108874 11-30-07 09:49 jrst-0.8.1/lib/xom-1.0.jar 
    63966 11-30-07 09:49 jrst-0.8.1/lib/avalon-framework-4.1.3.jar 
138228 11-30-07 09:49 jrst-0.8.1/lib/batik-gui-util-1.6-1.jar 
216394 11-30-07 09:49 jrst-0.8.1/lib/l2fprod-common-0.1.jar 
121689 11-30-07 09:49 jrst-0.8.1/lib/lutinutil-0.26.jar 
    76687 11-30-07 09:49 jrst-0.8.1/lib/batik-ext-1.6-1.jar 
124724 11-30-07 09:49 jrst-0.8.1/lib/xmlParserAPIs-2.6.2.jar 

正如您所看到的,不需要手動執行此操作有點令人滿意。

到目前爲止,我只試過AutoJar和ProGuard,兩者都很容易運行。看起來JAR文件中的常量池存在一些問題。

顯然jrst是有點破,所以我會去修復它。該Mavenpom.xml文件顯然是打破過,所以我必須解決這個問題JRST固定之前......我覺得自己像一個錯誤磁鐵:-)


更新:我從來沒有抽時間去修復這個應用程序,但我檢出了基於胖JAR的Eclipse的「Runnable JAR導出嚮導」。我發現這很容易用於部署我自己的代碼。

其他一些極好的建議可能會更適合在非Eclipse環境中構建,oss可能應該使用Ant進行構建。 (到目前爲止,Maven給我帶來了痛苦,但其他人卻喜歡它。)

+0

http://www.jdotsoft.com/JarClassLoader.php – gorokhmn 2010-03-02 14:05:26

+0

[Fat Jar Eclipse Plugin](http://fjep.sourceforge.net/) – 2008-09-17 09:07:13

+0

[One-Jar](http:// one-jar。 sourceforge.net/) – 2008-09-17 09:04:48

回答

33

Eclipse 3.4 JDT的Runnable JAR導出嚮導。

在Eclipse 3.5中,這已被擴展。現在你可以選擇你想如何處理你引用的JAR文件。

+0

您可以檢查生成的螞蟻腳本是否可用?之前有一個絕對文件路徑而不是相對的問題。 – 2009-11-28 10:06:01

14

如果您是Maven用戶,通常程序集插件會根據您的需要或可能的陰影插件以及某些情況下的組合。

使用程序集插件,您可以使用任何必要的設置將清單文件放入項目中,但默認值通常很好。然後建築物與

mvn assembly:assembly 

或者如果你有更多特殊的事情來處理,其他目標之一。所有包含的JAR文件都由Maven的依賴解析器提取。如果您使用陰影插件,它通常是安裝目標的一部分,並且在一個特定的項目,我現在做的我做

mvn install 
mvn assembly:single 

assembly:single目標是解決問題的壽命,在這種情況下,一個Spring申請。

3

有一個名爲autojar的工具,它將掃描您的字節碼並用它找到的類(包括引用的類)編譯.jar文件。

並不總是像春天工作,雖然,在這裏您可以指定配置的類名,並得到由框架加載。

+0

感謝您的指針,似乎在這個特定的應用程序中的一些.jars讓我感到頭疼。 – tovare 2008-09-17 13:31:04

27

已經嘗試了幾種不同的解決方案,我發現One-JAR最簡單的工作,並設法做到這一點:產生一個單一的,可執行的JAR,其中包含我需要的一切。

One-JAR使用可以導航嵌套資源的自定義類加載器。看看在下載.bat文件,它看起來像org.codelutin.jrst.JRST在JRST-0.8.1.jar是主類,所以你的表現應該是這樣的:

Main-Class: com.simontuffs.onejar.Boot 
One-Jar-Main-Class: org.codelutin.jrst.JRST 

的非常酷的事情是One-JAR會爲你處理傳遞命令行參數。假定您需要的所有資源都捆綁到單個JAR中,那麼類路徑由自定義類加載器處理。

使用One-JAR的最簡單方法是使用ant;有一個自定義的「一罐子」蟻的任務,工作過程如下(假設你的清單被稱爲「rst.mf」):

<target name="jar-rst"> 
    <one-jar destfile="rst.jar" manifest="rst.mf"> 
     <main jar="jrst-0.8.1.jar" /> 
     <lib> 
      <fileset dir="${pathToJars}"> 
       <include name="batik-util-1.6-1.jar" /> 
       <include name="icu4j-2.6.1.jar" /> 
       <include name="commons-collections-3.1.jar" /> 
       <!-- Snip --> 
      </fileset> 
     </lib> 
    </one-jar> 
</target> 
+1

螞蟻一個罐子的可編碼性使其可用於連續構建系統。 – 2009-11-28 10:07:00

+0

1.如果在我的jar中有幾個應用程序(幾個入口點類),One-JAR是否可用? 2.如果這個jar被另一個應用程序使用,它可以使用「One-JAR」中的嵌套jar文件中的類嗎? – MRalwasser 2012-05-02 10:09:47

8

ProGuard這不僅收拾你的JAR文件合併爲一個,但它還可以優化,清理或混淆您的類文件,使得生成的JAR文件比之前的所有JAR文件的總和小得多。

我實際上已經使用JRST工具試用了ProGuard,並且正如您所報告的那樣。我試圖跟蹤這個問題,發現它與jrst引用的ICU4J庫中的a bug有關。問題是,使用的ICU版本現在已經過時了。所以我用ICU4J版本3.2替換了icu.jar文件。現在,ProGuard發現了一堆關於JRST圖書館失靈的其他錯誤/警告。

我的猜測是ProGuard按預期工作,但jrst的庫並不一致。我不知道你是否可以做更多的事情,而不是與開發者交談,因爲他們應該檢查和更新項目的依賴關係。

+0

謝謝!我下載了它並嘗試了一下,但是在這個特殊領域,它用icu4j-2.6.1.jar, – tovare 2008-09-17 10:36:20

3

或使用Maven的組裝插件(MVN組裝:組裝)

8

您可以使用JarJar將使用軟件包陰影,以確保您的JAR文件不與他人發生衝突。

63

Ant的zipfileset確實

<jar id="files" jarfile="all.jar"> 
    <zipfileset src="first.jar" includes="**/*.java **/*.class"/> 
    <zipfileset src="second.jar" includes="**/*.java **/*.class"/> 
</jar> 
5

一JAR 0.97剛剛在http://one-jar.sourceforge.net發佈,並一直延續王氏爲框架,如SpringGuice,這可能會出現麻煩其他方法支持這項工作。它還處理類加載器反轉 - 其中一些JAR文件位於One-JAR的外部(例如,可能未捆綁發貨的JDBC驅動程序)。

One-JAR是命令行,帶有AntMaven 2個插件。使用「jar」工具進行構建也很簡單。

我也可以推薦Ference Hechler在其中寫道的Eclipse Jar Exporter(Runnable):他在創建一個包裝一組JAR文件的簡單方法方面做得非常出色。他和我一起工作過One-JAR,但Jar Exporter基於不同的代碼庫。

7

(基於安德里安的):

<jar id="files" jarfile="all.jar"> 
    <zipgroupfileset dir="${library.dir}" includes="*.jar" excludes="test-helper.jar"/> 
    <zipfileset src="first.jar" includes="**/*.java **/*.class"/> 
    <zipfileset src="second.jar" includes="**/*.java **/*.class"/> 
    <fileset dir="."> 
    <include name="LICENSE"/> 
    <include name="NOTICE"/> 
    </fileset> 
</jar> 
2

我認爲你需要這裏的工具是JarSplicehttp://ninjacave.com/jarsplice

它確實不是需要Ant或Maven,有它自己的圖形用戶界面,使用起來很直截了當,並且完全按照你的要求去做 - >它合併幾個j的內容ar文件合併爲一個文件(請注意,它仍然需要添加自己的類加載器)。

相關問題