10

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?

Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
Irfan Zulfiqar
  • 2,029
  • 5
  • 16
  • 21

8 Answers8

19

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

araqnid
  • 127,052
  • 24
  • 157
  • 134
4

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.

Bartosz Klimek
  • 555
  • 2
  • 5
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.

Simon Sobisch
  • 6,263
  • 1
  • 18
  • 38
user98960
  • 41
  • 1
2

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.

Bhushan Bhangale
  • 10,921
  • 5
  • 43
  • 71
1

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.

Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
marksml
  • 145
  • 1
  • 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;
Muhammad Hewedy
  • 29,102
  • 44
  • 127
  • 219
1

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
Irfan Zulfiqar
  • 2,029
  • 5
  • 16
  • 21
1

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
Brian Agnew
  • 268,207
  • 37
  • 334
  • 440