2010-05-22 62 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 - 更多信息可以在这里阅读。