Rekursive Suche nach Klassen in Java-Archiven

2011-08-25

In welchem Java-Archiv war noch einmal die Klasse X? Ist die Klasse Y vielleicht noch in einem anderen JAR vorhanden? Hier kann eine rekursive Suche im Dateisystem helfen indem als kleines Hilfswerkzeug die folgende Shell-Funktion in der Datei ~/.bashrc eingefügt wird.

search_jars() {
    search_dir=$1 
    search_term=$2 
    if [ -z "$search_term" -o -z "$search_dir" ]; 
    then
        echo "usage: search_jars [DIRECTORY] [SEARCH_TERM]"
        return 1
    fi
    echo "Searching JARs which contain classes matching \
        '$search_term' in '$search_dir'"
    find $search_dir -name "*.jar" -type f -exec \
         bash -c 'jar tvf "$1" | grep "$2"; \
             if [ $? == 0 ]; then \
                 echo "Found in JAR $1"; \
             fi' {} {} $search_term \;
}

Das folgende Beispiel ruft search_jars auf der Konsole im aktuellen Verzeichnis auf und findet sämtliche Java Archive, die einen Klassennamen enthalten, welcher mit Locator.class endet.

>search_jars . Locator.class
Searching JARs which contain classes matching 'Locator.class' in directory '.'
  com/sun/xml/bind/validator/DOMLocator.class
  com/sun/xml/bind/validator/Locator.class
  com/sun/xml/bind/validator/SAXLocator.class
Found in JAR ./jaxb1-impl.jar
  javax/xml/bind/ValidationEventLocator.class
Found in JAR ./jaxb-api.jar
  com/sun/tools/xjc/reader/dtd/bindinfo/DOM4JLocator.class
  com/sun/tools/xjc/reader/dtd/bindinfo/DOM4JLocator.class
Found in JAR ./jaxb-xjc.jar