Find your class in JAR files

Some time ago I’ve posted about using multiple -exec options for find command which can be used to find in what JARs particular class lies. Below you can find enriched and more intuitive/detailed solution for finding your class in a bunch of JARs:

#!/bin/bash

if [ $# -lt 1 ]
then
        echo 'Usage: jarfind CLASS_NAME [DIR_WITH_JARS]';
        exit 1;
fi

WHAT="$1"

if [ $# -eq 2 ]
then
        WHERE="$2"

else
        WHERE="."
fi

FIND_RESULT=`find "$WHERE" -maxdepth 2 -name '*.jar' -type f` 

for LINE in $FIND_RESULT 
do
        grep -q "$WHAT" "$LINE" 
        if [ $? -eq 0 ]
        then 
                echo "$LINE"
                jar tvf "$LINE" | grep "$WHAT"
                echo
        fi
done

The first argument is the class name you want to search for and the second one is the directory in which the jar files should be located (relative to the current directory). If the second argument is not specified, it defaults to current directory.

Result of this command should look something like this:

piotr@piotr-Vostro-3550:~/KonaKart_6.0/webapps$ jarfind AdminCustomer konakart/WEB-INF/lib/
konakart/WEB-INF/lib/konakartadmin.jar
11064 Tue Jan 24 21:16:16 CET 2012 com/konakartadmin/app/AdminCustomer.class
4008 Tue Jan 24 21:16:18 CET 2012 com/konakartadmin/app/AdminCustomerGroup.class
8166 Tue Jan 24 21:16:16 CET 2012 com/konakartadmin/app/AdminCustomerSearch.class
34964 Tue Jan 24 21:16:28 CET 2012 com/konakartadmin/bl/AdminCustomerMgr.class
2697 Tue Jan 24 21:16:28 CET 2012 com/konakartadmin/blif/AdminCustomerMgrIf.class
2389 Tue Jan 24 21:16:28 CET 2012 com/konakartadmin/blif/AdminCustomerTagMgrIf.class

If you save it as a BASH script file e.g. jarfind.sh and you set an alias for it, i.e. alias jarfind='/home/username/.jarfind.sh' in your .bashrc file than you can use it like this:

// Assuming that *.jar files are in the current directory
$ jarfind MyClassName
    
// Assuming that *.jar files are in the "myapp/WEB-INF/lib" directory,
// relative to the current directory
$ jarfind MyClassName myapp/WEB-INF/lib

Based on Andrew Monkhouse one-liner posted here. Much obliged for it Andrew!