62 votes

Trouver un fichier jar à partir du nom de la classe?

Ce doit être une question très simple pour les développeurs Java, mais quel est le meilleur moyen pour trouver le fichier jar donné un nom de classe?

Par exemple, étant donné "com.ibm.websphere.de sécurité.auth.WSSubject", comment voulez-vous traquent le bocal de fichier? ("google" n'est pas la réponse que je cherche!)

La java docs ne donner aucun soupçon du fichier jar, et, évidemment, les noms des fichiers jar, eux-mêmes, aucune idée.

Il doit y avoir une 'recherche local pots", ou une sorte "d'auto-résoudre des dépendances", le truc dans le monde java. Idéalement, je suis à la recherche de la "officielle" de façon à ce faire. Il m'arrive d'être sur une machine windows sans cygwin.

81voto

Dan Dyer Points 30082

L'enregistrer comme findclass.sh (ou autre), le mettre sur votre chemin et de le rendre exécutable:

#!/bin/sh
find "$1" -name "*.jar" -exec sh -c 'jar -tf {}|grep -H --label {} '$2'' \;

Le premier paramètre est le répertoire à la recherche récursive et le deuxième paramètre est une expression régulière (généralement un simple nom de la classe) à la recherche.

$ findclass.sh . WSSubject

Le script s'appuie sur l'option-t pour le pot de commande (qui affiche le contenu) et grep chaque table des matières, de l'étiquetage, aucune correspondance avec le chemin d'accès du fichier JAR dans lequel il a été trouvé.

14voto

ipolevoy Points 1250

J'ai écrit un programme pour cela: http://code.google.com/p/jar-explorer/ Il décompilera également le code octet existant pour vous montrer les interfaces, méthodes, super classes, affichera le contenu d'autres ressources - texte, images, html, etc.

13voto

Dave Costa Points 25282

Il n’existe pas de méthode "officielle" en Java pour ce faire.

La façon dont je le recherche habituellement consiste à utiliser find et jar pour parcourir tous les fichiers jar d'un arbre donné.

 > find . -name \*.jar -print -exec jar tf {} oracle/sql/BLOB.class \;
./v2.6.1/lib/csw_library.jar
./v2.6.1/lib/oracle_drivers_12_01.jar
oracle/sql/BLOB.class
 

Si vous utilisez Windows et que vous ne souhaitez pas installer Cygwin, vous devrez probablement écrire un script batch pour localiser les fichiers jar.

5voto

Stephen Muench Points 31

Si le grep de votre système (Solaris, par exemple) ne comporte pas -H et --label comme dans l'exemple de Dan Dyer, vous pouvez utiliser:

 find . -name '*.jar' -type f | xargs -i bash -c "jar -tvf {}| tr / . | grep WSSubject && echo {}"
 

5voto

Pour rechercher tous les fichiers JAR du répertoire en cours et renvoyer ceux contenant la classe abcD, procédez comme suit:

 find . -iname *.jar | while read JARF; do jar tvf $JARF | grep a/b/c/D.class && echo $JARF ; done
 

Il signalera toutes les instances de la classe abcD (ou des classes avec un suffixe similaire) et imprimera uniquement les fichiers JAR qui le contiennent.

Sortie typique:

 $ find . -iname *.jar | while read JARF; do jar tvf $JARF | grep Log.class && echo $JARF ; done
479 Fri Oct 10 18:19:40 PDT 2003 org/apache/commons/logging/Log.class
3714 Fri Oct 10 18:19:40 PDT 2003 org/apache/commons/logging/impl/Log4JCategoryLog.class
1963 Fri Oct 10 18:19:40 PDT 2003 org/apache/commons/logging/impl/NoOpLog.class
9065 Fri Oct 10 18:19:40 PDT 2003 org/apache/commons/logging/impl/SimpleLog.class
./WebContent/WEB-INF/lib/commons-logging.jar
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X