JarScan, scan all JAR files in all subfolders for specific class

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

3

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.

0

If 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; 

Your Answer

Sign up or log in

Sign up using Google Sign up using Facebook Sign up using Email and Password

Post as a guest

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

You Might Also Like