1

我正在开发一个使用 34 个外部 jar 的现有 Java 应用程序。

我的部分工作是使代码更简洁,不那么臃肿。通过从路径中删除它并测试代码,我可以轻松找到根本没有使用的库。

但是,我怀疑有些库只使用了一小部分(可能是一个或两个函数)。

例如,有一个用于一些 UI 构建的库。但是,我怀疑在应用程序代码中,它仅用于其一/两个日志记录功能。我实际上可以实现我自己的那个函数版本,并完全让应用程序摆脱那个库。

由于我无法手动浏览代码,是否有任何现有工具可用于查看应用程序代码中使用了多少库代码?

4

4 回答 4

1

JDepend可以告诉您应用程序类的直接依赖关系,但这并不能真正告诉您可以消除哪些 JAR,原因(至少)有两个:

  1. 它只能获取已编译的类引用。如果您使用像 Spring 这样的工具,它允许您在非代码配置文件中指定类,JDepend(或任何其他工具)无法识别它们。如果您使用Class.forName.
  2. 你的代码可能不直接引用一个类,但你加载的东西可能(Maven 称之为传递依赖)。例如,Hibernate 需要 CGLib 或 Javassist(或者至少以前需要)。如果您依赖 Hibernate,那么您就隐含地依赖这些 JAR 之一。

从 JDepend 开始可能是最简单的,并且只使用它告诉您您需要的 JAR 进行构建。然后,在运行时,您将获得 class-not-found 异常,这些异常会告诉您需要哪些额外的 JAR。

编辑:

由于我无法手动浏览代码,是否有任何现有工具可用于查看应用程序代码中使用了多少库代码?

作为重读你的问题,我意识到你要求的东西比简单的依赖分析更有针对性。我认为代码覆盖率工具可能会为您指明正确的方向。一些开源的可能性:

您可以检测整个应用程序,然后正常运行它并找出实际调用了哪些类。但是,您需要充分锻炼它。Java 根据需要加载类,因此您的应用程序可能仅依赖于类的某些特性。

于 2013-01-24T21:39:48.523 回答
1

我倾向于使用proguard之类的东西来识别旧的未使用代码,尽管它具有大量其他功能,但它们与您的问题无关。

于 2013-01-24T21:16:28.890 回答
0

您可以搜索 JAR 开头的包的代码和 xml。

我会尝试从构建中删除它并重新构建程序,并在编译时对其进行测试。

于 2013-01-24T21:14:49.020 回答
0

对于快速而肮脏的策略,您可以选择编写一个脚本来递归所有应用程序代码并提取所有导入,按最少到最常用对其进行排序,将基本导入包结构与 jar 匹配,然后检查使用最少导入 jar 的位置.

为了更好地进行长期分析,请先尝试解决这些问题。首先,如果可以,最好使用标准构建工具转换应用程序,例如 maven。接下来让应用程序在标准 IDE 上运行和构建,例如 eclipse。

现在您可以搜索和使用可以让您做您需要做的事情的插件。

例如行家

mvn 依赖:分析

看看可以做同样事情的 eclipse 插件

例如

http://classpathhelper.sourceforge.net/

未来有可维护性

这可能是额外的前期工作,但您可以更好地分析代码,您的任务就会更快。如果您想成为大师,您甚至可以编写一个 eclipse 插件并分享它!

于 2013-01-24T21:41:01.653 回答