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

11,313

Solution 1

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

Solution 2

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.

Solution 3

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.

Solution 4

If you need result only then you can install agentransack http://www.mythicsoft.com/agentransack/ and do a containing text search. Agentransack searches inside jar and zip files as well.

Solution 5

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
Share:
11,313
Irfan Zulfiqar
Author by

Irfan Zulfiqar

One more software engineer

Updated on June 05, 2022

Comments

  • Irfan Zulfiqar
    Irfan Zulfiqar almost 2 years

    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?

  • Irfan Zulfiqar
    Irfan Zulfiqar about 15 years
    Using 'unzip -l' instead for 'jar' made it run very very fast. 'jar' took 72 seconds vs 4 second when run with 'unzip -l'
  • Ian McLaird
    Ian McLaird about 15 years
    I came in here to say exactly this. +1
  • extraneon
    extraneon about 15 years
    If I want to know in which jar a certain class can be found I usually do something like cd ~/.m2/repository; grep -r -H "classname" *.