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

时间:2010-11-19 06:56:17

标签: java jar

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

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

4 个答案:

答案 0 :(得分:7)

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

Here链接不再有效)是一个示例报告。正如您所看到的,您只需要“未使用的JAR ”这一功能。

答案 1 :(得分:5)

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

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

我在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