现有应用程序在其类路径中有大量JAR文件。有人必须最初添加所有JAR才能确定。有些JAR显然没有被使用,我们已经删除了一些不需要的JAR而没有造成任何问题。
如何确定使用哪些JAR以及哪些JAR不需要(除了试错法)?
答案 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