I posted a few days ago about finding which JAR file contains a class file – something I often want to do. My friend Chris Johnson promptly posted a better version here with caching – thanks Chris!
Chris said I inspired him to finish his script 🙂 and in return he has inspired me to improve it further. As I often work with JAR files in a development environment, and often a lot of them, the search can take a while, so the caching is great. But – those files can change over time, so I need the cache to be kept up to date.
Here is an updated version of Chris’ version that will update the cache if a JAR file is newer than the cache:
#!/bin/sh
TARGET="$1"
CACHEDIR=~/.jarfindcache
# prevent people from hitting Ctrl-C and breaking our cache
trap 'echo "Control-C disabled."' 2
if [ ! -d $CACHEDIR ]; then
mkdir $CACHEDIR
fi
for JARFILE in `find $PWD -name "*jar"`
do
CACHEFILE=$CACHEDIR$JARFILE
if [ ! -s $CACHEFILE ]; then
mkdir -p `dirname $CACHEFILE`
nohup jar tvf $JARFILE > $CACHEFILE
# if the jar file has been updated, cache it again
elif [ $JARFILE -nt $CACHEFILE ]; then
nohup jar tvf $JARFILE > $CACHEFILE
fi
grep $TARGET $CACHEFILE > /dev/null
if [ $? == 0 ]
then
echo "$TARGET is in $JARFILE"
fi
done
P.S. If you are running this on Ubuntu (or Debian), like me, you better make that first line a bit more explicit:
#!/bin/bash
Enjoy!

In my environment, “unzip -l” was much faster than “jar tvf” — thanks for the article though!