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

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

就像是:

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文件中搜索该类

不是直接回答你的问题,但也许这可以解决你的问题:你可以通过在代码中添加一个简单的行来打印出加载特定类的位置(例如jar文件):

 System.err.println(YourClass.class.getProtectionDomain().getCodeSource()); 

然后你就会知道它来自哪里。

工具JAR Explorer非常有用。

它弹出一个带有两个面板的GUI窗口。 您可以选择一个目录,该工具将扫描该目录中的所有JAR文件,然后让您搜索特定的类。 然后,下面板将显示所有扫描的JAR文件中该类的命中列表。

如果您只需要结果,则可以安装agentransack http://www.mythicsoft.com/agentransack/并执行包含文本搜索。 Agentransack也在jar和zip文件中搜索。

现在回答这个问题的是一个简单的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 

几年前我写了一个实用程序类查找来解决这样的问题。 将类路径设置为指向.jar集,classfind将告诉您它将在哪个jar中找到特定的类。

 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 

您可能还想查看Java工具JarScan 。

可以按类名和包搜索。

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

 #! /bin/sh path=$1 segment=$2 if [ -z "$path" ] || [ -z "$segment" ] then echo "Usage: $0  " exit fi for jar in $path/*.jar ; do echo " *** $jar *** " ; jar tf $jar| grep --color=always $segment; done;