簡體   English   中英

找出實際加載的Java類並減少jar

[英]Find out which Java classes are actually loaded and reduce jar

有沒有辦法自動找出實際加載的Java類(在編譯期間,在可能的情況下,或在應用程序的運行時),並從JAR中拋出所有其他類以創建更小的JAR ? 這在實踐中真的有意義嗎?

我在談論應用程序JAR的應用程序類。 通常,應用程序中有許多庫,而應用程序很少需要這些庫的所有功能。 所以我懷疑這會使一個相當小的應用程序。 從理論上講,可以通過Java代理來完成,該代理記錄一個或多個應用程序運行(或者甚至只是java -verbose:class)讀取哪些類和資源,以及拋出所有其他類的maven插件來自jar-with-dependencies。 有這樣的東西嗎?

澄清:我不是在談論未使用的依賴項(根本沒有使用的JAR),而是關於刪除每個包含的JAR的未使用部分。

好吧,在為您的應用程序創建Uber-JAR時,Maven Shade插件有一個選項minimizeJar

https://maven.apache.org/plugins/maven-shade-plugin/

但是,正如其他人已經指出的那樣,這是非常危險的,因為它經常無法檢測通過Reflection或其他動態引用完成的類訪問。

它可能不是一種自動化的好方法,因為應用程序可以使用反射來初始化對象,或者一個JAR依賴於另一個JAR。

我能想到的唯一方法是逐個刪除每個JAR並檢查應用程序是否按預期運行。 然后,在這種方法中,必須測試應用程序的所有模塊,因為一個模塊可以在沒有特定依賴性的情況下工作而其他模塊可以不工作

更好的解決方案是在開發過程中注意。 應用程序開發人員必須小心添加依賴項並在完成他/她的代碼之后刪除不需要的依賴項。

全球戰略。

1)查找運行時加載的所有類。

2)類路徑中可用的所有類的列表。

3)通過創建僅包含所需類的jar的副本來減少類路徑。

我做了1和2部分,所以我可以幫助你。


1)找出所有加載的類。 您需要100%的代碼覆蓋率(我不是在談論測試,而是生產)。 因此,請運行所有可能的方案,以便加載和記錄您的應用程序所需的所有類。

要記錄加載的類,請嘗試幾種方法。 反思-verbose:class flag ,也可以了解java代理。 它允許在運行時修改方法。 這是一些java代理程序代碼另一個java代理程序示例的示例

2)要查找jar中可用的所有類,可以編寫程序。 您需要知道放置應用程序罐的所有位置。 循環拋出這些jar(你可以使用ZipFile ),循環遍歷ZipFileEntry條目,並收集所有類。

3)之后編寫一個重新組裝應用程序的腳本或程序。 例如,現在您可以為每個庫創建一個新的jar文件,並只放置所需的類。

你也可以使用一個工具(再次,你是一個程序員,所以寫一個程序),它檢查代碼的類依賴性。 如果用於編譯,則不希望刪除類。 當我還是一名學生時,我編寫了代碼alanyzer,它為類依賴項構建了一個面向圖。

正如@Gokul Nath KP所說,我之前做過這件事。 我手動更改gradle和maven依賴項,逐個刪除,然后完全回歸測試。 我用了一個星期(與數百名開發人員創建的現代企業系統相比,我們的應用程序很小)。

因此,要有創意,如果成功,您的項目將被數百萬人使用!

暫無
暫無

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

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