如何确定Java程序使用哪些类?

如何确定Java程序使用哪些类?,java,optimization,jar,dependencies,Java,Optimization,Jar,Dependencies,是否有任何工具可以列出应用程序有效使用哪些类以及何时使用某些类,或者更好的是,自动修剪JAR库以仅提供引用和使用的类?请记住,正如所证明的,您不能肯定地说某个特定类正在使用或没有使用。至少在任何中等复杂的应用程序上。这是因为类不仅在编译时绑定,而且可以加载: 基于XML配置(如Spring) 从属性文件加载(例如JDBC驱动程序名称) 动态添加注释 作为外部输入的结果加载(例如用户输入、来自数据库或远程过程调用的数据) 等等 所以仅仅看源代码是不够的。也就是说,任何合理的IDE都将为您提供依

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

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

  • 基于XML配置(如Spring)
  • 从属性文件加载(例如JDBC驱动程序名称)
  • 动态添加注释
  • 作为外部输入的结果加载(例如用户输入、来自数据库或远程过程调用的数据)
  • 等等
所以仅仅看源代码是不够的。也就是说,任何合理的IDE都将为您提供依赖性分析工具。IntelliJ当然有

您真正需要的是对应用程序正在执行的操作进行运行时插装,但即使这样也不能保证。毕竟,由于输入的奇怪组合,特定的代码路径可能会出现1000万次运行中的一次,因此无法保证覆盖了您

不过,像这样的工具确实有一些价值。你可能想看看这样的东西。像这样的探查器可以为您提供一个代码转储,您也可以对其进行分析(尽管这不会很好地拾取瞬态对象)

就我个人而言,除了IDE告诉您的:删除未使用的jar之外,我觉得没有什么价值。比这更细粒度只不过是自找麻烦,收获甚微。

你可以试试JarJar


它会修剪jar依赖项。

是的,您需要。它是一个完全免费的Java代码收缩器和模糊器。它易于配置,快速有效。

在大多数情况下,只需使用javac就可以轻松地完成


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

只需确保提供正确的“根”类列表,从中搜索引用,并且不要忘记通过反射使用的任何类。我认为OP指的是库以及您自己的类。如果我们不动态加载类,该怎么办?换句话说,没有XML配置、属性文件、注释、rpc等等。那么,这样的工具能保证工作吗?停止的问题只排除了对“非平凡”属性的保证正确的是/否答案。我们可以通过允许错误答案(误报/否定)来避免HP;或者允许一个额外的“未知”答案;或者让它变得“琐碎”(例如,某些关键字是否出现在程序中的任何地方),专门创建一个胖罐子和一个只包含代码的罐子。使用“java-jar.jar find class code.jar fat.jar”,它将列出您的依赖项。您可以基于此创建一个包含“keep”语句的规则文件,然后将fat jar处理到最小化的jar中。