4

这可能不是最佳实践,但有办法从第三方的 jar 文件中删除未使用的类。查看我的类使用库的方式并进行某种覆盖分析,然后吐出另一个 jar 并删除了所有未触及的类。

显然这有问题。具体来说,我提出的使用场景可能不会一直使用所有类。

但是忽略这些问题,原则上能做到吗?

4

7 回答 7

8

有一种方法。

JarJar 项目就是这样做的。JarJar 项目的第一个目标是允许将第三方库嵌入到您自己的 jar 中,并在必要时更改包结构。这样做可以去掉不需要的类。

在http://code.google.com/p/jarjar/上查看。

这是一个关于缩小罐子的链接: http: //sixlegs.com/blog/java/jarjar-keep.html

于 2008-09-01T23:14:40.343 回答
2

Ant 中有一个称为类文件集的工具。您指定您知道需要的根类的列表,然后类文件集递归地分析它们的代码以查找所有依赖项。

或者,您可以开发一个很好的测试套件来练习您需要的所有功能,然后在测试覆盖工具下运行您的测试。该工具将告诉您实际使用了哪些类(以及其中的语句)。与静态分析相比,这可以为您提供更小的代码集。

于 2008-09-02T17:08:56.203 回答
2

I use ProGuard for this. As well as being an excellent obfuscator, it has a code shrinking phase which can combine multiple JARs and then strip out any unused classes or class members. It does an excellent job at shrinking.

于 2009-11-24T07:47:12.163 回答
1

在之前的工作中,我使用了一个 Java 混淆器,它除了混淆代码之外,还删除了未使用的类和方法。如果您正在执行“Class.byName”或任何其他类型的反射内容,则需要告诉混淆器,因为它无法通过检查代码来判断反射调用了哪些类或方法。

当然,问题在于您不知道第三方库的其他部分是否正在进行任何反射,因此删除“未使用”类可能会导致事情在您尚未测试的晦涩案例中中断。

于 2008-09-01T19:20:53.947 回答
0

jar 只是一个 zip 文件,所以我想你可以。如果你能找到源头,那就更干净了。也许尝试拆卸类?

于 2008-09-01T19:13:55.617 回答
0

添加到这个问题,可以提高性能吗?由于未使用的类不会被 JIT 编译以改善启动时间,还是 java 在编译为字节码时自动检测到,甚至不处理未使用的代码?

于 2008-09-01T19:16:11.570 回答
0

这将是一个有趣的项目(有人已经做过了吗?)

我想你会给工具你的 jar(s) 作为起点,并清理库 jar。它可以使用反射来确定您的 jar 直接引用哪些类,以及在调用树中间接使用哪些类(这根本不是微不足道的,而是可行的)。如果它在这两个地方的任何一个地方遇到任何反射代码,它应该给出一个非常响亮的警告。

于 2008-09-01T20:18:57.817 回答