2012-03-01 51 views
4

我想知道是否可以編寫一個Ant任務(如果需要,使用其他庫)來減少JAR文件,以便它只包含某些類以及它們所依賴的類。例如,我有一個包含類A,B,C和D的JAR,其中A和B都擴展C. D與其他類無關。我想要做的是指定一個Ant任務,我只需要B類,最後得到一個只包含B和C的JAR文件。Ant任務只保留JAR中的某些類,並進行依賴性檢查?

我見過this answer它提供了一種簡單的方式來說「I不希望A和d」,和我想象代替‘’用‘排除包括’可以讓我指定‘我想B和C’這樣的:

<jar destfile="stripped.jar"> 
    <zipfileset src="full.jar" includes="path/B.class;path/C.class"/> 
</jar> 

...但有這樣做的依賴感知方式,以便我可以說「我想要B」但結束了包含B及其依賴項的JAR?

+1

請注意,答案中提到的所有工具只能找到顯式依賴關係,而不能通過反射獲取依賴關係(其中包括依賴注入和許多應用程序框架採用的類似機制)。 – 2012-03-02 13:32:17

回答

3

你可以看看混淆工具,它們也可以經常刪除死代碼,也就是類,方法之類的代碼中沒有引用的代碼。

例如,您可以使用ProGuard

從文檔:

的ProGuard是一個免費的Java類文件收縮機,優化,obfuscater和預校驗。它檢測並刪除未使用的類,字段,方法和屬性。它優化字節碼並刪除未使用的指令。它使用短無意義的名稱重命名剩餘的類,字段和方法。最後,它預先驗證了Java 6或Java Micro Edition的處理代碼。

您可以將其配置爲僅執行收縮步驟。在你的情況下,你會使用-keep選項來告訴ProGuard你想要B類,最後用B和C來描述。這可能不是你想要的,因爲ProGuard也將刪除未使用的方法等,修改你的JAR文件中的類(我不知道任何關閉此選項的選項)。此外,您需要告知ProGuard不要執行任何其他通常會執行的操作,例如混淆。

如果ProGuard不符合您的需求,您可以查找其他混淆和/或縮小工具。希望這會有所幫助,祝你好運!

3

由於user829876suggests,ProGuard可能是一種選擇。

另一個選項,可能更接近您要查找的是GenJar。幾年來沒有太多的活動,但它聽起來像它會做你所需要的。你可以找到一些例子here。有沒有非常manyalternatives

您可能想要考慮的另一個工具是Autojar。它似乎沒有Ant任務,但您可以使用Java任務來完成任務。

我從來沒有使用這些工具,但它不應該花太多的嘗試,看看什麼對你有用。如果需要,這些來源可用於您的調整。