web-dev-qa-db-fra.com

Trouver un fichier jar avec le nom de la classe?

Cela doit être une question très basique pour les développeurs Java, mais quelle est la meilleure façon de trouver le jar file Donné un nom du cours?

Par exemple, étant donné " com.ibm.websphere.security.auth.WSSubject ", comment traquer le fichier jar approprié? ("google" n'est pas la réponse que je recherche!)

Les Java docs ne donnent aucune indication sur le fichier jar, et évidemment les noms des fichiers jar eux-mêmes n'offrent aucun indice.

Il doit y avoir une "recherche dans les bocaux locaux", ou une sorte de "dépendances de résolution automatique", astuce dans le monde Java. Idéalement, je cherche la façon "officielle" de faire Il se trouve que je suis sur une machine Windows sans cygwin.

62
Jeffrey Knight

Enregistrez-le sous findclass.sh (ou autre), mettez-le sur votre chemin et rendez-le 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 à rechercher récursivement et le second paramètre est une expression régulière (généralement juste un simple nom de classe) à rechercher.

$ findclass.sh . WSSubject

Le script s'appuie sur l'option -t de la commande jar (qui répertorie le contenu) et greps chaque table des matières, étiquetant toutes les correspondances avec le chemin du fichier JAR dans lequel il a été trouvé.

81
Dan Dyer

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

14
ipolevoy

Il n'y a pas de moyen "officiel" Java pour faire cet AFAIK.

La façon dont je le recherche habituellement consiste à utiliser find et jar pour parcourir tous les fichiers jar dans une arborescence donnée.

> 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 êtes sous Windows et que vous ne souhaitez pas installer Cygwin, je suppose que vous devrez écrire un script batch pour localiser les fichiers jar.

13
Dave Costa

Pour rechercher tous les fichiers sous le répertoire actuel et renvoyer ceux qui contiennent la classe a.b.c.D, procédez comme suit:

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

Il rapportera toutes les instances de la classe a.b.c.D (ou les classes avec un suffixe similaire) et n'imprimera que les pots 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
5

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

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

Vous pouvez essayer des services comme:

Ou

Ou

  • Un référentiel d'entreprise maven avec une fonction de recherche, par exemple Nexus (OFC, cela ne fonctionnerait que si les pots que vous recherchez sont indexés, c'est-à-dire installés dans le référentiel)

PS: Jarhoo s'est associé à Javacio.us pour fournir à 100 000 Java avec un accès gratuit à Jarhoo via des liens intégrés à leurs résultats de recherche Google. Abonnement à Javacio .us est gratuit et ouvert à toute personne possédant un compte Google. Pour plus d'informations, veuillez visiter la page de l'offre Jarhoo sur Javacio.us .

4
Pascal Thivent

Essayez findjar.com. Si c'est dans le domaine public, vous devriez l'obtenir. Il y a alos mavenjava.com (mais ce site semble être en panne)

3
Joseph

Sous Windows, exécutez cmd.exe et tapez:

  for %i in (*.jar) do @jar tvf %i | find "/com/company/MyClass.class"

Les pots devraient être dans le répertoire courant. Pour a également une option/R qui prend un répertoire et vous permet de rechercher récursivement.

Si Jar.exe n'est pas sur votre chemin, vous pouvez faire quelque chose comme @C:\jdk\bin\jar.exe.

3
Yishai

Imprimer la liste au fur et à mesure pour voir ce que je vérifie. Généralement, je cherche dans un répertoire lib/app, mais vous pouvez remplacer une recherche par la recherche.

par exemple.

for jar in $(find some_dir/lib -name "*.jar" ); 
do
echo -------------$jar-------------------
jar -tf $jar | grep TheNameOfTheClassImLookingFor
done
2
Steve B.

Il y a aussi ce site web qui semble être utile. http://www.findjar.com/

1
Ron Tuffin

Dans windows powershell, vous pouvez utiliser cette commande. Il répertorie tous les fichiers JAR qu'il rencontre, mais il a une ligne supplémentaire très facile à repérer où il trouve également votre classe.

Get-ChildItem -recurse -Filter *.jar | Foreach {echo $_.fullname; c:\somepath\JDK\BIN\jar tvf $_.fullname | Select-String -pattern "Cabbages.class"}
1
WoodenKitty

J'utilise jarscan . Il s'agit d'un fichier jar exécutable qui peut rechercher récursivement dans une structure de dossiers entière des jars contenant la classe que vous recherchez. Il recherche par nom de classe, nom de package ou expression régulière.

1
Mike Pone

Compte tenu de votre commentaire sur la tentative de gestion des dépendances, je me concentrerais sur les bibliothèques que vous utilisez. Sachant cela, vous saurez quels pots doivent être sur le chemin de la classe, et vous pouvez y prêter attention. Il existe également des constructeurs de gestion des dépendances (Maven et Ant étant les deux populaires) qui peuvent regrouper des projets avec leurs dépendances à l'intérieur. Cependant, au final, il appartient au développeur de savoir de quelles dépendances il dispose et de prêter attention aux exigences de ces dépendances. C'est une des raisons pour lesquelles l'utilisation d'un IDE comme Eclipse, et des outils de construction comme Maven ou Ant sont si agréables dans les grands projets, comme lorsque vous avez 20 dépendances pour un projet, cela peut devenir assez ingérable.

1
aperkins

localiser .jar | xargs grep com.ibm.websphere.security.auth.WSSubject

0
Paul Tomblin

Je recommande d'utiliser Maven, Eclipse et m2Eclipse.

Étape 1 - Ajouter une importation spécifique

alt text

Étape 2 - Trouvez et téléchargez (automatiquement) le pot souhaité

alt text

0
cetnar

En s'appuyant sur l'excellente réponse de Dan , le script suivant résout le problème de la sortie déformée au cas où certains des pots sont en fait des liens symboliques cassés (tout en ne sautant pas les bons liens symboliques). Il recherche également dans le courant répertoire si aucun argument n'est fourni.

#!/usr/bin/env bash

if [[ ($# -ne 1) && ($# -ne 2) ]]
then
    echo "usage is $0 <grep RegEx to look for in contents of jar> [<top-of-folder-hierarchy> or, if missing, current dir]"
else
    REG_EXP=$1
    DIR=${2:-.}
    if [ ! -d $DIR ]; then
        echo "directory [$DIR] does not exist";
        exit 1;
    fi
    find "$DIR" -name "*.jar" -exec sh -c '
    (test -e {})
    exitStatus=$?
    if [ "$exitStatus" -eq 0 ]; then # this is done to avoid broken symlinks
        jar -tf {}|grep -i -H --label {} '$REG_EXP'
    fi
' \;
fi
0

si vous recherchez toujours WSSubject, le fichier jar est wssec.jar. Classe WSSecurityException dans sas.jar

0
Som