2010-05-22 35 views
3

我有我的小program.jar,它使用巨大的library.jar的一小部分。選擇性jar包裝

是否有工具將幾個罐子重新包裝成一個,因此它可以獨立運行並儘可能小?

更新:大小很重要。

+0

純粹出於好奇,爲什麼尺寸很重要? (我碰巧在同一時間提出類似的問題http://stackoverflow.com/questions/2888299/is-there-any-disadvantage-to-putting-api-code-into-a-jar-along-與類) – 2010-05-22 14:06:57

+0

因爲我的程序有幾千字節,並且圖書館有幾兆字節。 – 2010-05-22 15:43:21

+0

您需要確定使用Class.forName(...) – 2010-05-22 20:01:13

回答

3

proguard,與Ant和Maven插件。它刪除未使用的代碼,可選地混淆並壓縮到單個jar。

Proguard的降低在兩條戰線上

  1. 僅實際使用被存儲在最終罐的類尺寸。
  2. 長名稱,例如所有長包名稱,類名都被重新命名爲更短的名稱,節省了相當多的空間。

確定一個類是否在java中使用有點棘手。靜態代碼分析可以幫助您達到目標,但您需要通過反射訪問一些小心的代碼,因爲該工具可能無法檢測到該代碼。它處理Class.forName(「xyzFoo」),但任何更復雜的事情,你需要將它添加到要包含的類的配置文件中,可以讓一個類加載器生成一個在運行時使用的類的列表,所以這並不一定是艱鉅的。

您可能也想調查pack200壓縮方案,因爲這也可以使jar的大小顯着減小。

2

您可以嘗試使用螞蟻jar task - 更多信息可以在這裏閱讀。