2010-11-19 89 views
15

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

如何确定哪些JAR正在被使用以及哪些不需要(除了试验和错误方法)?

回答

7

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

Here链接不再工作)是一个示例报告。正如你所看到的,你只是有你正在寻找的功能“未使用的JAR”。

+0

刚刚尝试过这一个。它能够指出一些未使用的罐子,但错过了我故意添加到项目中的一些罐子。由于易用性和详细的报告,仍然是推荐的工具。谢谢你。 – 2010-11-20 03:11:25

5

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

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

+0

同意。如果它们是动态加载的,那么任何自动化工具都可能会遗漏其中的一些。 – ZoFreX 2010-11-19 09:27:48

0

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

0

我在jboss portal项目中使用了以下shell脚本来获取导入语句中使用的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 
相关问题