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

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

但忽略这些问题,原则上可以吗?

有帮助吗?

解决方案

有一种方法。

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

检查一下: http://code.google.com/p/jarjar/.

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

其他提示

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

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

我用 混淆卫士 为了这。它不仅是一个出色的混淆器,还具有代码收缩阶段,可以组合多个 JAR,然后删除任何未使用的类或类成员。它做了一个 出色的 工作正在萎缩。

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

当然,问题在于您不知道第三方库的其他部分是否正在执行任何反射,因此删除“未使用”的类可能会导致在您尚未测试的模糊情况下出现问题。

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

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top