When you work on a Java project with many library dependencies it can be difficult to know which Jar files contain which classes. Hunting down a particular class in a tangled mess of Jar files can be painful, especially if you need to do so on a server over a shell connection.
Here is a handy shell script that iterates over all the Jar archives in a given path, finds those containing file names that match a given pattern, and prints out these matches followed by the name of the Jar file.
#!/bin/sh if [ -z "$2" ] then echo Usage: $0 Directory ClassName exit 1 fi for f in $(find $1 -name '*.jar') do jar tf $f | grep "$2" && echo "[in $f]" done
Save this script to a file with an obvious name, like findInJars.sh.
To find all the classes with names containing "HttpClient" in the libs directory, you would invoke the script like so:
$ sh findInJars.sh libs HttpClient org/apache/commons/httpclient/HttpClient.class org/apache/commons/httpclient/HttpClientError.class org/apache/commons/httpclient/params/HttpClientParams.class [in libs/commons-httpclient/commons-httpclient-3.1.jar]
If you are impatient, you can accomplish the same thing with a big and ugly one-liner:
for f in $(find libs -name '*.jar'); do jar tf $f | grep HttpClient && echo "[in $f]"; done