我知道這不是「最佳實踐」,但是我可以將所有依賴包括在一個大的jar中嗎?是否有可能將所有jar依賴關係打包到一個大的jar包中?
回答
有一個實用工具叫做One-Jar它可以做你想做的,但我建議不要這樣做。表現通常很糟糕。
經常可以,但有時會出現異常合法或技術原因不適用。
法律:例如,我們發現,當時我們想,我們不能JavaMail JAR文件一起打包成一個大包與我們的應用程序的其他部分,但該許可協議說我們必須讓他們分開。
技術:另一個問題可能是自定義類加載器在特定的jar文件中查找特定的資源或類。這通常發生在應用程序服務器或ESB容器的上下文中。
如何做到這一點,只需將所有東西放到一個目錄中,然後從那裏重建一個jar。您可能需要調整META-INF文件夾中的某些設置以刪除加載附加jar的請求,並處理不同jar各自都有默認類運行的情況。有一些第三方實用程序可能會有所幫助,但除非您知道他們正在做什麼,否則您會想要小心。
讓我們假設它是合法的,你怎麼做? – Eric 2009-06-29 18:55:25
+1。 Maven對於照顧這種類型的東西非常棒。不過,我建議創建一個自定義程序集,而不是使用默認的jar-with-dependencies,因爲你可以通過這種方式獲得更好的結果。 另外,值得注意的是,最新的彙編插件有些bug,並添加了多個你的依賴關係的副本,所以在修復之前我建議使用以前的版本。 – dborba 2009-06-29 19:01:07
使用好老的螞蟻:只要使用zipgroupfileset
與螞蟻Zip task
<zip destfile="out.jar">
<zipgroupfileset dir="lib" includes="*.jar"/>
</zip>
這將拼合所有包含的jar庫的內容。
我們應該如何處理jar文件中的多個Manifest文件? – 2009-12-04 03:06:19
這需要`org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader`才能工作。除非使用`org.eclipse.jdt.internal.jarinjarloader`包,否則所包含的jar將不會在classpath上可用。 – 2013-01-07 15:41:40
Eclipse 3.4及更高版本可以讓你做到這一點。右鍵單擊您的項目,選擇Extract,然後導航到Runnable Jar選項。選擇下一步。選擇適當的設置,然後關閉並運行。我似乎還記得,這個功能是通過FatJar(上面提到的)使用的相同或類似的庫實現的。
只是爲了完整性,ProGuard會爲您做到這一點,以及可選地混淆和縮小JAR。後一個函數對於創建最終部署JAR特別有用。
還要記住.jar文件。封面下的zip文件。你可以使用你喜歡的zip工具來重新打包它們。在這種情況下,你必須自己處理清單文件。
我的感覺是,稱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。
希望它有幫助。
One-JAR在啓動時將所有依賴關係jar加載到內存中。這聽起來可能非常低效,但自2004年發佈以來,沒有人向我抱怨。預加載的可能影響是整個應用程序的類加載速度加快,因爲類加載器不必重複掃描類路徑對於運行應用程序的資源和類:所有內容都是哈希映射的。
構建一個可以按需加載的懶惰加載程序非常簡單:但我的學校說「構建它,測量它,改進它,如果有必要」,到目前爲止還沒有需要改進它。
我會在將來的版本中記住這一點(或者如果別人想要解決它,那也會很棒,因爲沒有一個非常大的應用程序來衡量,很難知道改變是否有所改進)。
- 1. 如何將帶有Gradle的所有依賴關係jar包?
- 2. 創建一個可執行的jar包括NetBeans中的所有依賴關係
- 3. 在JAR表單中包含一個Bundle包依賴關係
- 4. 將所有依賴關係打包在jar或war在maven構建?
- 5. Maven測試jar包括依賴關係
- 6. 將jruby腳本打包成jar與所有依賴?
- 7. buildr:包依賴到一個JAR
- 8. 如何將依賴關係jar文件包含到jar文件中
- 9. Maven:編譯一個項目中的一個Jar中的所有依賴關係
- 10. 是否有包含所有JBOSS運行時jar的maven JBOSS依賴項?
- 11. 包含可執行文件的外部依賴關係.jar
- 12. 註解 - JAR依賴關係
- 13. 訪問Jar依賴關係
- 14. Java Maven Jar依賴關係
- 15. 將一個jar包及其依賴項打包成一個側面神器(不生成一個胖jar)
- 16. OSGI包VS JAR依賴
- 17. 使用Mina JAR依賴關係而不是捆綁包?
- 18. 如何引用可執行jar中的maven依賴jar包?
- 19. 是否可以創建一個包含項目類和項目依賴關係的「超級」jar作爲帶有自定義清單文件的jar包?
- 20. Maven - 是否有命令下載所有依賴jar的父poms?
- 21. 如何在java webstart項目中包含jar依賴關係
- 22. 如何在Weblogic MbeanMaker MJF JAR中包含外部依賴關係?
- 23. 在ant build中包含休眠jar依賴關係
- 24. 當依賴於JAR時,是否可以排除類/包?
- 25. 將存儲庫中的所有jar添加爲IntelliJ中的依賴關係
- 26. 裝配只包含提供的依賴關係的jar
- 27. 爲什麼我的SBT intelliJ不包含依賴關係JAR?
- 28. gradle保存依賴關係的jar包在哪裏?
- 29. 包括來自存儲庫依賴關係的備用jar
- 30. 是否有可能創建包含android功能的jar?
請詳細說明可怕的表現。我使用它,並希望得到反饋。 – 2009-06-29 21:58:33
現在我已經很久沒有使用它了,但是我記得,由於JAR解包的方式,類加載性能非常差。但就像我說的,這是一段時間。 – skaffman 2009-06-29 22:16:52