2009-06-29 76 views

回答

2

有一個實用工具叫做One-Jar它可以做你想做的,但我建議不要這樣做。表現通常很糟糕。

+2

請詳細說明可怕的表現。我使用它,並希望得到反饋。 – 2009-06-29 21:58:33

+0

現在我已經很久沒有使用它了,但是我記得,由於JAR解包的方式,類加載性能非常差。但就像我說的,這是一段時間。 – skaffman 2009-06-29 22:16:52

2

經常可以,但有時會出現異常合法技術原因不適用。

  • 法律:例如,我們發現,當時我們想,我們不能JavaMail JAR文件一起打包成一個大包與我們的應用程序的其他部分,但該許可協議說我們必須讓他們分開。

  • 技術:另一個問題可能是自定義類加載器在特定的jar文件中查找特定的資源或類。這通常發生在應用程序服務器或ESB容器的上下文中。

如何做到這一點,只需將所有東西放到一個目錄中,然後從那裏重建一個jar。您可能需要調整META-INF文件夾中的某些設置以刪除加載附加jar的請求,並處理不同jar各自都有默認類運行的情況。有一些第三方實用程序可能會有所幫助,但除非您知道他們正在做什麼,否則您會想要小心。

+2

讓我們假設它是合法的,你怎麼做? – Eric 2009-06-29 18:55:25

5

如果你想做到這一點,有一個工具Jar Jar Links這將爲你做這個。從未使用過它,但很難忘記它的名字。

+5

減一百萬爲雙關 – skaffman 2009-06-29 19:00:37

13
+3

+1。 Maven對於照顧這種類型的東西非常棒。不過,我建議創建一個自定義程序集,而不是使用默認的jar-with-dependencies,因爲你可以通過這種方式獲得更好的結果。 另外,值得注意的是,最新的彙編插件有些bug,並添加了多個你的依賴關係的副本,所以在修復之前我建議使用以前的版本。 – dborba 2009-06-29 19:01:07

2
  • 可以其unjar文件,並使用命令行重新包裝他們

  • 您可以使用[uberjar]

  • 您可以使用fatjar

+0

fatjar使用其他地方提到的一個罐子 – 2009-06-29 21:59:03

9

使用好老的螞蟻:只要使用zipgroupfileset與螞蟻Zip task

<zip destfile="out.jar"> 
    <zipgroupfileset dir="lib" includes="*.jar"/> 
</zip> 

這將拼合所有包含的jar庫的內容。

+2

我們應該如何處理jar文件中的多個Manifest文件? – 2009-12-04 03:06:19

+0

這需要`org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader`才能工作。除非使用`org.eclipse.jdt.internal.jarinjarloader`包,否則所包含的jar將不會在classpath上可用。 – 2013-01-07 15:41:40

2

Eclipse 3.4及更高版本可以讓你做到這一點。右鍵單擊您的項目,選擇Extract,然後導航到Runnable Jar選項。選擇下一步。選擇適當的設置,然後關閉並運行。我似乎還記得,這個功能是通過FatJar(上面提到的)使用的相同或類似的庫實現的。

2

只是爲了完整性,ProGuard會爲您做到這一點,以及可選地混淆和縮小JAR。後一個函數對於創建最終部署JAR特別有用。

0

還要記住.jar文件。封面下的zip文件。你可以使用你喜歡的zip工具來重新打包它們。在這種情況下,你必須自己處理清單文件。

16

我的感覺是,稱One-Jar的表現糟糕而不好是不公正的。對於中等規模的應用程序,人們可以預計啓動時間會延長几秒(儘管這不會影響JVM啓動畫面)。對於大多數環境來說,幾十兆字節的內存開銷可以忽略不計,除了嵌入式系統。此外,One-Jar能夠自動將一些文件提取到文件系統,從而無需在我的情況下開發安裝程序。

以下是一個嘗試量化One-Jar對我的應用程序引入的性能影響。它是基於Swing的GUI應用程序,由352個被ProGuard 4.5b2混淆的類組成。使用One-Jar 0.96將結果類與12MB的庫(ODFDOM,Saxon HE,Xerces,Jaxen,VLDocking,Apache Commons等)捆綁在一起。我已經將混淆瓶子的性能與One-Jar處理過的同一個罐子進行了比較。

  • 從JVM開始到main()方法的開始:沒有One-Jar的0.5s和One-Jar的1.7s。從JVM開始到屏幕上應用程序窗口的出現:不帶One-Jar的2.3s和帶One-Jar的3.4s。所以One-Jar增加了1.1的啓動時間。
  • One-Jar不會增加屏幕上顯示的JVM啓動和閃屏圖像之間的延遲(如果通過jar清單實現),所以啓動時間的增加對於交互式應用程序來說不會太煩人。
  • 我們正在討論一個類加載器,因此除非您廣泛使用動態類加載,否則應該不會影響代碼執行速度。
  • 查看JVM統計信息(通過jconsole)顯示,One-Jar'red版本需要更多堆內存。對於我的應用程序來說,開銷是幾十MB的量級。我看到的數據是16MB vs 40MB,306MB vs 346MB,131MB vs 138MB,這取決於應用程序正在處理的很多用戶數據,現在已經執行了很久以前的垃圾收集器。通過採取時間戳剛剛從Linux的殼開始JVM,在main()方法的開始之前獲得

上述定時,以及我的應用程序窗口中的windowOpened()的事件處理程序。這些測量是在一臺不是特別快的D820筆記本電腦上進行的,該筆記本電腦使用運行Ubuntu 8.04的雙核1GHz CPU和2G或RAM。

希望它有幫助。

6

One-JAR在啓動時將所有依賴關係jar加載到內存中。這聽起來可能非常低效,但自2004年發佈以來,沒有人向我抱怨。預加載的可能影響是整個應用程序的類加載速度加快,因爲類加載器不必重複掃描類路徑對於運行應用程序的資源和類:所有內容都是哈希映射的。

構建一個可以按需加載的懶惰加載程序非常簡單:但我的學校說「構建它,測量它,改進它,如果有必要」,到目前爲止還沒有需要改進它。

我會在將來的版本中記住這一點(或者如果別人想要解決它,那也會很棒,因爲沒有一個非常大的應用程序來衡量,很難知道改變是否有所改進)。

相關問題