JarScan,扫描所有子文件夹中的特定类的所有JAR文件

时间:2009-04-17 10:35:05

标签: java class jar

虽然我们有最新的部署,但我们看到正在使用旧版本的类。要扫描应用程序服务器的所有子文件夹中的所有JAR文件,我们如何编写一个小的shell脚本来打印出找到此特定类的JARS文件的文件名?

8 个答案:

答案 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将在当前目录

下找到的所有jar文件中搜索该类

答案 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)

您可能还想查看Java工具JarScan

可以按类名和包搜索。

当Total Commander不可用且只允许执行Java时,它会有很大帮助。

答案 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;