如何确定应用程序中使用的JAR

现有应用程序在其类路径中有大量JAR文件。 有人必须最初添加所有JAR才能确定。 有些JAR显然没有被使用,我们已经删除了一些不需要的JAR而没有造成任何问题。

如何确定使用哪些JAR以及哪些JAR不需要(除了试错法)?

Tattletale是一个很好的工具。 它适用于字节码,因此有可能通过reflection使用某些类,并且不会出现在报告中。

这里 ( 链接不再有效 )是一个示例报告。 如您所见,您只需拥有正在寻找“ Unused JAR ”的function。

请注意,单独的试验和错误可能是一个问题,特别是如果应用程序动态加载类(例如Class.forName ),因为删除JAR可能无法阻止应用程序启动并且(显然)工作正常,但如果以后可能会失败,找不到目标类。

此外,有许多工具可用于分析Java应用程序并找出依赖关系(我自己使用过Dependency Finder ,虽然不完全是出于此目的),但请注意,大多数工具也无法找到加载的类动态如上所述。

如果它们中的任何一个是动态加载的,那么自动化工具可能会错过它们。 我会重置文件的访问时间,运行应用程序一段时间(并确保调用尽可能多的function),并查看访问了哪些文件,哪些文件没有访问。 您可能需要在应用程序需要运行的每个平台上重复此操作,以防万一。

我在jboss门户项目中使用了以下shell脚本来获取import语句中使用的jar文件列表。 这将只用于直接依赖,而不是动态加载,甚至在源中使用完全限定的类名时。 此外,所有jar文件及其传递依赖项都由容器提供,因此只需编译代码即可。

目标是为项目创建maven pom并找到需要部署到nexus存储库管理器的文件。 作为列出绝对需要的文件的起点可能是有用的,剩余的jar文件必须以其他方式进行检查。 如果jar也可以在maven存储库中使用,那么您可以查看其依赖关系。

 #!/bin/sh JBOSS_HOME=/path/to/jboss/installation JBOSS_LIB=$JBOSS_HOME/server/default/lib JBOSS_DEPLOY=$JBOSS_HOME/server/default/deploy SRC_DIR=src for f in $JBOSS_LIB/*.jar $JBOSS_DEPLOY/jboss-portal.sar/lib/*.jar $JBOSS_DEPLOY/jboss-portal.sar/portal-cms.sar/lib/*.jar $JBOSS_DEPLOY/ejb3.deployer/*.jar do for c in `jar -tf $f | tr '/$' '..'` do #echo "^import ${c%.class};" if `grep "^import ${c%.class};" -h -r $SRC_DIR -q` then echo $f $c fi done done