Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

how to find the jar file containing a class definition? [closed]

Is there a tool, plugin, or script I can use to find a java class in a bunch of jar files?

Very often I inherit code that complains about a class that doesn't exist, and it is just because the jar file is not included in the classpath. But, in what jar file(s) is the class? I may not have the JAR (so I have to search online), or adding a JAR to the classpath could create a duplicated class definition problem.

I obviously would prefer an eclipse plugin, but I'm open to any piece of software that works with Windows.

I know... Windows is not my choice, but that's what I got to work with.

Thanks!

Luis

P.S. Thank you for your answers. After reviewing some responses, I became aware that I should have explained better my scenario. We had a library of downloaded or created JAR files, but sometimes the class would be online somewhere.

like image 686
luiscolorado Avatar asked Aug 16 '10 21:08

luiscolorado


People also ask

How do you check if a class exists in a jar file?

To find the . jar files that contain a class, you can use the FindClass.sh script. First go to a UNIX installation of Sterling Platform/MCF. If the FindClass.sh script already exists it should be in your $YFS_HOME directory or your $YFS_HOME/lib directory.

How can I tell which class a JAR was loaded from?

The, the idea is to use find on the root of your classpath to locate all jars, then runs findclass.sh on all found jars to look for a match. It doesn't handle multi-directories, but if you carefully choose the root you can get it to work.

How do I extract a class from a jar file?

You can open the jar file with winrar, this will show all the class files within, from there, you can drag them all into JD-GUI and decompile them all.


2 Answers

(This is an improvement over the script I had in previous versions of the answer as it produces much cleaner output at the price of some awk special/ugly quoting.)

I've built a script (findinjars) which does just that.

#!/usr/bin/env bash if [[ ($# -ne 1) && ($# -ne 2) ]] then     echo "usage is $0 <grep pattern to look for in 'jar tvf' output> [<top-of-dir-tree> or, if missing, current dir]" else     THING_TO_LOOKFOR="$1"     DIR=${2:-.}     if [ ! -d $DIR ]; then         echo "directory [$DIR] does not exist";         exit 1;     fi     find "$DIR" -iname \*.jar | while read f ; do (jar tf $f | awk '{print "'"$f"'" "  " $0}' | grep -i "$THING_TO_LOOKFOR") ; done fi 

you can then invoke it with:

$findinjars a.b.c.d.Class [directoryTreeRoot or, if missing, current dir] 

or just

$findinjars partOfClassName [directoryTreeRoot or, if missing, current dir] 

Dot characters in the fully qualified class name will be interpreted in the regexp sense of 'any character' but that's not a big deal since this is a heuristics utility (that's why it's case-insensitive too BTW). Usually I don't bother with the full class name and just type part of it.

like image 127
Marcus Junius Brutus Avatar answered Oct 02 '22 16:10

Marcus Junius Brutus


In the same lines as BalusC's answer (I can't post comment yet nor link 2 urls, no reputation :( ), you can find a jar thanks to these 2 jar finder engines: - http://www.jarfinder.com/ - findjar

like image 21
Fanny H. Avatar answered Oct 02 '22 15:10

Fanny H.