减小jar依赖大小

12

我编写的应用程序使用了几个第三方jar包。有时只会使用整个50kB到1.7mB jar包中的一小部分 - 一个或两个函数调用或类。

如何最好地减小jar大小?我应该下载源代码并构建只包含所需类的jar包吗?有哪些现有工具可以帮助自动化此过程(例如,我简要查看了http://code.google.com/p/jarjar/)?

谢谢

编辑1: 我想降低我的第三方'official' jar包的大小,比如swingx-1.6.jar(1.4 MB),set-3.6(1.7 MB),glazedlists-1.8.jar(820kB)等,以便它们只包含我需要的最少类

编辑2: 如果库使用反射,则手动或使用类似proguard的程序最小化jar会更加复杂。 Injection with google guice does not work anymore after obfuscation with proguard

另一个帖子上cletus给出的答案非常好:如何确定Java程序使用哪些类?

3个回答

5

Proguard是一个选项。它可以消除未使用的类和方法。您还可以使用它进行混淆,从而进一步减小最终JAR文件的大小。请注意,按名称加载类容易出现问题,除非注意保持受影响的类未混淆。

我发现Proguard非常有效-起初可能有点晦涩难懂。但我没有任何类似的经验可以提供比较。


我已经使用了Proguard对我的应用程序jar进行混淆,并取得了良好的结果,注意到输出大小更小。我也遇到了“损坏的类”问题,正如你所提到的,与xstream对象有关,直到我将它们添加到“keep”部分。但是,我尚未使用proguard来减小我的依赖项jar文件的大小 - 这可能吗? - brian_d
@brian_d - 是的,使用-injars/-outjars应该是可能的。我猜“难度级别”将与您拥有的jar数量有关。我曾经使用过的一个示例用途是bouncycastle加密。我能够只包含我需要的类,丢弃所有未使用算法的代码等。 - martin clayton

0
首先,如果您只使用JAR文件中的一个类,这并不意味着该类不使用该JAR中的其他类。 如果您使用开源JAR,则可以获取该JAR的源代码,并将其附加到您的项目中,删除不必要的内容并自行构建更改。

仍然存在问题,如我在“编辑#2”中所提到的。我手动将swingx从1.4MB减少到160kB。它构建得很好,但在运行时崩溃,因为没有包括几个反射方法类调用。 - brian_d

0
你可以将GenJar作为Ant任务添加,并使用它来构建JAR。正如该库主页上所说,

GenJar是一种专门的Ant任务,根据类依赖关系而不仅仅是目录内容来构建jar文件。

你可以在SourceForge上找到它。

1
我使用GenJar时只感到沮丧,因为出现了“无法解析”的错误。而且看起来自2003-03-06以来就没有更新过。 - brian_d
我发现当我使用Java 7而不是Java 8时,GenJar无法解决问题就消失了。 - Jon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接