We are seeing an older version of a class being used, although we had the latest one deploy. To scan all JAR files in all subfolders of an application server, how do we write a small shell script that prints out the file name of JARS files in which this specific class is found?
8 Answers
Something like:
find . -name '*.jar' | while read jarfile; do if jar tf "$jarfile" | grep org/jboss/Main; then echo "$jarfile"; fi; done You can wrap that up like this:
jarscan() { pattern=$(echo $1 | tr . /) find . -name '*.jar' | while read jarfile; do if jar tf "$jarfile" | grep "$pattern"; then echo "$jarfile"; fi; done } And then jarscan org.jboss.Main will search for that class in all jar files found under the current directory
Not directly answering your question, but maybe this will solve your problem: you can print out the location (e.g. the jar file) from which a specific class was loaded by adding a simple line to your code:
System.err.println(YourClass.class.getProtectionDomain().getCodeSource()); Then you will know for sure where it comes from.
The tool JAR Explorer is pretty useful.
It pops open a GUI window with two panels. You can pick a directory, the tool will scan all the JAR files in that directory, then let you search for a specific class. The lower panel then lights up with a list of hits for that class in all the scanned JAR files.
0If you need result only then you can install agentransack and do a containing text search. Agentransack searches inside jar and zip files as well.
Now to answer this question here is a simple shell command that did that for us.
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 Years ago I wrote a utility classfind to resolve issues like this. Set your classpath to point to your .jar set, and classfind will tell you in which jars it'll find a particular class.
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 You may also want to have a look at the Java tool JarScan.
One can search by class name and by package.
It helps a lot when Total Commander isn't available and only Java is allowed to execute.
#! /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;