【问题标题】:How to determine which classes are used by a Java program?如何确定 Java 程序使用了哪些类?
【发布时间】:2010-10-03 07:05:39
【问题描述】:

是否有任何工具可以列出应用程序有效使用哪些类以及何时有效使用,或者更好的是,自动修剪 JAR 库以仅提供被引用和使用的类?

【问题讨论】:

    标签: java optimization jar dependencies


    【解决方案1】:

    请记住,正如halting problem 所证明的那样,您不能肯定地说某个特定的类已被使用或未使用。至少在任何中等复杂的应用程序上。这是因为类不仅在编译时绑定,而且可以加载:

    • 基于 XML 配置(例如 Spring);
    • 从属性文件加载(例如 JDBC 驱动程序名称);
    • 动态添加注释;
    • 由于外部输入(例如用户输入、来自数据库的数据或远程过程调用)而加载;

    因此,仅查看源代码是不够的。话虽如此,任何合理的 IDE 都会为您提供依赖关系分析工具。 IntelliJ 当然可以。

    您真正需要的是运行时检测您的应用程序正在做什么,但即使这样也不能保证。毕竟,由于输入的奇怪组合,特定的代码路径可能会在 1000 万次运行中出现一次,因此无法保证您已被覆盖。

    这样的工具确实有一些价值。您可能想查看Emma 之类的内容。像Yourkit 这样的分析器可以给你一个代码转储,你也可以对它进行分析(尽管它不能很好地提取瞬态对象)。

    就我个人而言,除了 IDE 将告诉您的内容之外,我发现没有什么价值:删除未使用的 JAR。比这更细化只是自找麻烦。

    【讨论】:

    • 如果我们不动态加载类怎么办?换句话说,没有 XML 配置、属性文件、注释、rpc 等等。那么这样的工具能保证工作吗?
    • 停止问题仅排除对“非平凡”属性的保证正确是/否答案。我们可以通过允许不正确的答案(误报/否定)来避免 HP;或允许额外的“未知”答案;或者让它变得“微不足道”(例如,某些关键字是否出现在程序中的任何位置)
    【解决方案2】:

    是的,你想要ProGuard。它是一个完全免费的 Java 代码收缩器和混淆器。它易于配置、快速且有效。

    【讨论】:

    • 只需确保提供正确的“根”类列表,从中搜索引用,并且不要忘记通过反射使用的任何类。
    【解决方案3】:

    你可以试试 JarJar http://code.google.com/p/jarjar/

    它会修剪 jar 依赖项。

    【讨论】:

    • 专门创建一个 fat jar 和一个仅包含您的代码的 jar。使用'java -jar jarjar.jar find class code.jar fat.jar',它将列出您的依赖项。您可以基于此创建“保留”语句的规则文件,然后将胖 jar 处理到最小化的 jar 中。
    【解决方案4】:

    在大多数情况下,只需使用 javac 即可轻松完成。

    删除现有的类文件。使用您的入口类的名称调用 javac。它将编译那些必要的类,但仅此而已。任务完成。

    【讨论】:

    • 我认为 OP 意味着库以及您自己的类
    猜你喜欢
    • 2011-02-19
    • 1970-01-01
    • 1970-01-01
    • 2016-03-17
    • 2012-05-02
    • 2015-05-22
    • 2018-09-29
    • 1970-01-01
    相关资源
    最近更新 更多