虽然我们有最新的部署,但我们看到正在使用旧版本的类。要扫描应用程序服务器的所有子文件夹中的所有JAR文件,我们如何编写一个小的shell脚本来打印出找到此特定类的JARS文件的文件名?
答案 0 :(得分:17)
类似的东西:
find . -name '*.jar' | while read jarfile; do if jar tf "$jarfile" | grep org/jboss/Main; then echo "$jarfile"; fi; done
你可以这样包装:
jarscan() {
pattern=$(echo $1 | tr . /)
find . -name '*.jar' | while read jarfile; do if jar tf "$jarfile" | grep "$pattern"; then echo "$jarfile"; fi; done
}
然后jarscan org.jboss.Main
将在当前目录
答案 1 :(得分:4)
不直接回答您的问题,但这可能会解决您的问题:您可以通过在代码中添加一行简单的行来打印出加载特定类的位置(例如jar文件):
System.err.println(YourClass.class.getProtectionDomain().getCodeSource());
然后你就会知道它来自哪里。
答案 2 :(得分:3)
工具JAR Explorer非常实用。
弹出一个带有两个面板的GUI窗口。您可以选择一个目录,该工具将扫描该目录中的所有JAR文件,然后让您搜索特定的类。然后,下面板将显示所有扫描的JAR文件中该类的命中列表。
答案 3 :(得分:2)
如果您只需要结果,则可以安装agentransack http://www.mythicsoft.com/agentransack/并执行包含文本搜索。 Agentransack也在jar和zip文件中搜索。
答案 4 :(得分:1)
现在回答这个问题的是一个简单的shell命令,它为我们做了这个。
for jarFile in $(
ls -R |
awk '
match($0, ".*:") {
folder=$0
}
! match($0, ".*:") {
print folder$0
}' |
grep "\.jar" |
sed -e "s/:/\//g"
);
do
unzip -l $jarFile;
done |
awk '
match($0, "Archive.*") {
jar=$0
}
! match($0, "Archive.*") {
print jar" : "$0
}' |
grep org.jboss.Main
答案 5 :(得分:1)
多年前,我写了一个实用工具classfind来解决这样的问题。将类路径设置为指向.jar集,classfind将告诉您它将在哪个罐中找到特定的类。
example% classfind -c Document
/usr/java/j2sdk1.4.0/jre/lib/rt.jar -> org.w3c.dom.Document
/usr/java/j2sdk1.4.0/jre/lib/rt.jar -> javax.swing.text.Document
答案 6 :(得分:1)
答案 7 :(得分:1)
#! /bin/sh
path=$1
segment=$2
if [ -z "$path" ] || [ -z "$segment" ]
then
echo "Usage: $0 <path> <segment>"
exit
fi
for jar in $path/*.jar ; do echo " *** $jar *** " ; jar tf $jar| grep --color=always $segment; done;