簡體   English   中英

Java - 如何減小第三方jar的大小以減小應用程序的大小

[英]Java - How to reduce the size of third-party jars to reduce the size of your application

我正在開發一個java Web應用程序 ,其中包括一個applet 該applet依賴於兩個jar文件:

  • JFreeChart (用於在客戶端繪制圖形) - 1.7 MB(jar文件的大小)
  • MySqlJdbcConnector(用於存儲在客戶端捕獲的數據到遠程數據庫) - .7 mb(jar文件的大小)

現在,問題是上面兩個jar文件的大小。 我的applet jar (myApplet.jar)的總大小是2.5 MB ,其中2.4 MB是因為上面兩個jar文件。

我沒有使用那些jar文件中的所有類。 具體來說,對於jfreechart ,我使用的是來自該庫的極少數類。

============================== 問題 =================== ===================

Q1。 為了創建myApplet.jar文件,我所做的是解壓縮了兩個jar文件(jfreechart和mySQLJdbcConnector),然后使用我的applet代碼的源代碼打包解壓縮版本的jar文件,以創建一個jar文件( 即myApplet.jar)。 這是用你的applet代碼打包第三方jar文件的正確方法嗎? 有什么方法可以優化這個嗎?

Q2。 我試圖找到我在我的應用程序中使用的jfreechart庫類的依賴項,以便只在myApplet.jar中打包這些依賴項。 為此,我使用DependencyAnalyzer查找所有類的依賴項。 但后來我發現很難手動這樣做,因為每個類(我在我的應用程序中使用的jfreechart類)都有很多依賴項,而且我使用了15個類的jfreechart,因此為每個類執行此操作將非常困難。 那有什么建議嗎?

Q3。 這種情況是非常普遍的開發人員遇到或我遺失的東西,因為我必須這樣做?

我建議嘗試ProGuard 您可以排除未使用的部分jar文件。

是的,您可以通過創建僅包含您的applet所需的類的JAR來節省空間。 (我看到這叫做超級JAR。)

有各種各樣的工具可以做到這一點; 例如ProGuard,Zelix ClassMaster,一個名字我遺忘的Maven插件,依此類推。

但是有一些問題,至少在一般情況下是這樣:

  • 如果您的代碼使用動態加載(例如通過調用Class.forName(className) ),則這些工具通常無法檢測依賴項。 因此,為了避免動態加載的類被排除在最終的JAR之外,您需要告訴工具應用程序可能以這種方式顯式加載的所有類的名稱。

  • 您需要查看第三方庫的許可證。 IIRC,某些許可證要求您以允許人們替換不同版本庫的方式將庫包含在分布式工件中。 有人可能會說,超級JAR讓這很難做到,因此可能會有問題。

JFreeChart是LGPL,LGPL是具有上述要求的許可證。 然而,MySQL是GPL,勝過LGPL,這意味着你的applet必須是GPL'...如果你分發它。


最后,如果您想最小化applet JAR的大小,則不應將您的源代碼包含在JAR中。 源代碼應該在單獨的JAR(或ZIP,TAR或其他)文件中。

A1:

您可以創建ant腳本或使用Eclipse或任何其他IDE自動打包applet。 但你的方式也是正確的

A2:

我不會手動做這些事情。 尋找傳遞依賴性非常復雜。 也許darioo的答案是更好的方法。

A3:

這確實非常普遍。 一些提示:

您始終可以在沒有調試信息的情況下重新構建這些第三方庫。 這應該會略微減少這些庫的大小。

另一方面,也許您不應該從applet直接連接到數據庫。 您可以創建一個RMI接口(或類似的東西)來將SQL和結果數據傳輸到實際執行SQL的應用程序服務器。 如果您不在安全的Intranet中運行它,這對您的applet來說是一個重要的安全方面。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM