How to search multiple jar files for a string or pattern (shell script)

Here’s a Unix shell script that I use that search Java “jar” files for any type of pattern. You can use it to search for the name of a class, the name of a package, or any other string/pattern that will show up if you manually ran jar tvf on each jar file. The advantage of this script — if you’re a Unix, Linux, or Cygwin user — is that it will search through all jar files in the current directory:

#!/bin/sh

LOOK_FOR="codehaus/xfire/spring"

for i in `find . -name "*jar"`
do
  echo "Looking in $i ..."
  jar tvf $i | grep $LOOK_FOR > /dev/null
  if [ $? == 0 ]
  then
    echo "==> Found \"$LOOK_FOR\" in $i"
  fi
done

Sample output: jar files that match regex pattern

This shows how I run this shell script, and the output from it:

$ ./searchjars.sh

Looking in ./activation-1.1.jar ...
Looking in ./commons-beanutils-1.7.0.jar ...
Looking in ./commons-codec-1.3.jar ...
Looking in ./commons-pool.jar ...
Looking in ./jaxen-1.1-beta-9.jar ...
Looking in ./jdom-1.0.jar ...
Looking in ./mail-1.4.jar ...
Looking in ./xbean-2.2.0.jar ...
Looking in ./xbean-spring-2.8.jar ...
Looking in ./xfire-aegis-1.2.6.jar ...
Looking in ./xfire-annotations-1.2.6.jar ...
Looking in ./xfire-core-1.2.6.jar ...
Looking in ./xfire-java5-1.2.6.jar ...
Looking in ./xfire-jaxws-1.2.6.jar ...
Looking in ./xfire-jsr181-api-1.0-M1.jar ...
Looking in ./xfire-spring-1.2.6.jar ...
==> Found "codehaus/xfire/spring" in ./xfire-spring-1.2.6.jar
Looking in ./XmlSchema-1.1.jar ...

I omitted a bunch of output there, but I hope you get the idea. This script can easily search dozens or hundreds of jar files if need be.

To improve this script I recommend two things. First, take the pattern you want to look for as a command-line argument instead of hard-coding it inside the script as I’ve done here. Second, search through all jar files in all sub-directories of the current directory. Both of these are easily done, and I’ll update this blog if/when I do that.

Permalink

Thanks very much! This has saved me some time!

Permalink

#!/bin/sh

clear

LOOK_WHERE=$1
LOOK_FOR=$2

if [ -z "$JAVA_HOME" ]
then
echo "No JAVA_HOME found - exiting..."
exit 0
else
echo "Good, JAVA_HOME is to $JAVA_HOME"
fi

if [ -f "jar" ] || [ -f "java" ]
then
echo "No executable java or jar found. Add JAVA_HOME/bin to your system path."
exit 0
else
echo "Good, found `which jar` in system path"
fi

if [ -z "$1" ] || [ -z "$2" ]
then
echo "Missing search attributes."
echo "Usage: searchjar.sh directory search.string"
exit 0
else
echo "You are looking for: $LOOK_FOR"
echo "in the following directory: $LOOK_WHERE"
fi

for i in `find $LOOK_WHERE -name "*jar"`
do
echo "Looking in $i ..."
jar tvf $i | grep $LOOK_FOR > /dev/null
if [ $? == 0 ]
then
echo "==> Found \"$LOOK_FOR\" in $i"
sleep 2;
fi
done

Cool ... many thanks. I don't know if it's necessary to check JAVA_HOME, but I definitely like the other checks, they make the script a little more user-friendly. Thanks again.

Permalink

Thank you, thank you, thank you!

Permalink

Thanks for the script , its very useful.

Permalink

./searchjars.sh: line 2: $'\r': command not found
./searchjars.sh: line 3: $'clear\r': command not found
./searchjars.sh: line 4: $'\r': command not found
./searchjars.sh: line 7: $'\r': command not found
./searchjars.sh: line 35: syntax error near unexpected token `$'do\r''
'/searchjars.sh: line 35: `do

I'll guess you're using this on cygwin? If so, you may need to correct the line-feed / carriage-return characters. I'm sorry, but I don't have a Windows system to test it on.

Add new comment

The content of this field is kept private and will not be shown publicly.

Anonymous format

  • Allowed HTML tags: <em> <strong> <cite> <code> <ul type> <ol start type> <li> <pre>
  • Lines and paragraphs break automatically.
By submitting this form, you accept the Mollom privacy policy.