我正在寫一個applet,它使用~10個外部庫。他們一起佔用超過2兆字節。在一些庫中,我們只使用1-2個類,所以很多其他類可以安全地刪除。所以問題是如何從jar庫中刪除未使用的類?如何縮小外部java庫?
很多其他問題鏈接到Proguard。但它不處理庫(或者我做錯了什麼),也毀掉了使用反射的代碼的一部分。
我正在寫一個applet,它使用~10個外部庫。他們一起佔用超過2兆字節。在一些庫中,我們只使用1-2個類,所以很多其他類可以安全地刪除。所以問題是如何從jar庫中刪除未使用的類?如何縮小外部java庫?
很多其他問題鏈接到Proguard。但它不處理庫(或者我做錯了什麼),也毀掉了使用反射的代碼的一部分。
你可以使用maven-shade-plugin,並告訴它建立一個最小化的jar文件,結合你的代碼和libs。
你可能使用類似ClassDep,它靜態地標識你將使用哪些類。
然而,它可以很容易地欺騙這個。想象一下你的一些代碼包含:
Class.forName(className);
所以你可以動態地構建一個類名並加載那個類。諸如ClassDep
之類的工具無法識別這些情況,因此您需要對縮小的罐子進行全面測試。
您可以簡單地「解壓縮」JAR,只需從每個類中選擇需要的類,然後將它們放置在自定義存檔中。 Brian A.對如何識別這些類和一些警告給出了很好的建議。我會添加他們,你可能會違反許可以及...
ProGuard可以將您的代碼與庫一起處理(使用選項-injars)。您仍然可以保留您不想處理的外部庫(使用選項-libraryjars)。
任何自動收縮工具都會遇到反射問題。 ProGuard可以識別一些基本的反射,並且允許您指定爲了反思而保留的內部API的部分。 ProGuard支持一些強大的配置,但取決於庫中的反射量,它可能仍然需要反覆試驗。
如果你想從外部庫中刪除文件,如果外部庫中的類是相關的,我覺得這是一個單調乏味的過程。可能是你可以開始刪除不必要的,並添加如果有任何投訴,如ClassNotFoundException。 AFAIK,proguard隱藏你的類文件,這並不意味着它刪除了不必要的類。 – kosa