JarScan, scan all JAR files in all subfolders for specific class
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
Comments
-
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 about 15 yearsUsing '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 about 15 yearsI came in here to say exactly this. +1
-
extraneon about 15 yearsIf 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" *.