如何将绒毛从第三方库中剥离出来?

时间:2008-09-01 19:09:20

标签: java optimization size

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

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

但忽视这些问题,原则上可以做到吗?

7 个答案:

答案 0 :(得分:8)

有办法。

JarJar项目执行此AFAIR。 JarJar项目的第一个目标是允许一个人在你自己的jar中嵌入第三方库,必要时更改包结构。这样做可以删除不需要的类。

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

以下是关于收缩罐子的链接:http://sixlegs.com/blog/java/jarjar-keep.html

答案 1 :(得分:2)

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

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

答案 2 :(得分:2)

我使用ProGuard。它是一个优秀的混淆器,它有一个代码缩小阶段,可以组合多个JAR,然后去掉任何未使用的类或类成员。它在收缩方面做了很好的优秀工作。

答案 3 :(得分:1)

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

问题当然是你不知道第三方图书馆的其他部分是否正在做任何反思,因此删除一个“未使用的”类可能会导致事情在一个不起眼的情况下破裂经过测试。

答案 4 :(得分:0)

jar只是一个zip文件,所以我想你可以。如果你能到达源头,那就更清洁了。也许尝试拆解课程?

答案 5 :(得分:0)

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

答案 6 :(得分:0)

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

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