web-dev-qa-db-fra.com

Comment obtenir les noms de classes dans un fichier jar?

J'ai un fichier JAR et je dois obtenir le nom de toutes les classes à l'intérieur de ce fichier JAR. Comment puis je faire ça?

Je l'ai googlé et j'ai vu quelque chose à propos de JarFile ou Java ClassLoader mais je ne sais pas comment le faire.

93
sticksu

Malheureusement, Java ne fournit pas un moyen facile de lister les classes dans le JRE "natif". Cela vous laisse plusieurs options: (a) pour tout fichier JAR donné, vous pouvez répertorier les entrées de ce fichier JAR, rechercher les fichiers .class, puis déterminer la classe Java que chaque fichier .class représente; ou (b) vous pouvez utiliser une bibliothèque qui le fait pour vous.

Option (a): analyse manuelle des fichiers JAR

Dans cette option, nous allons remplir classNames avec la liste de toutes les classes Java contenues dans un fichier jar à /path/to/jar/file.jar.

List<String> classNames = new ArrayList<String>();
ZipInputStream Zip = new ZipInputStream(new FileInputStream("/path/to/jar/file.jar"));
for (ZipEntry entry = Zip.getNextEntry(); entry != null; entry = Zip.getNextEntry()) {
    if (!entry.isDirectory() && entry.getName().endsWith(".class")) {
        // This ZipEntry represents a class. Now, what class does it represent?
        String className = entry.getName().replace('/', '.'); // including ".class"
        classNames.add(className.substring(0, className.length() - ".class".length()));
    }
}

Option (b): Utilisation de bibliothèques de réflexions spécialisées

Goyave

Goyave a ClassPath depuis au moins 14,0, ce que j’ai utilisé et apprécié. Une bonne chose à propos de ClassPath est qu'il ne charge pas les classes qu'il trouve, ce qui est important lorsque vous analysez un grand nombre de classes.

ClassPath cp=ClassPath.from(Thread.currentThread().getContextClassLoader());
for(ClassPath.ClassInfo info : cp.getTopLevelClassesRecurusive("my.package.name")) {
    // Do stuff with classes here...
}

Réflexions

Personnellement, je n'ai pas utilisé la bibliothèque Reflections , mais cela semble être apprécié. Certains exemples intéressants sont fournis sur le site Web, comme ce moyen rapide de charger toutes les classes d’un package fourni par le fichier any JAR, ce qui peut également être utile pour votre application.

Reflections reflections = new Reflections("my.project.prefix");

Set<Class<? extends SomeType>> subTypes = reflections.getSubTypesOf(SomeType.class);

Set<Class<?>> annotated = reflections.getTypesAnnotatedWith(SomeAnnotation.class);
61
sigpwned

Vous pouvez utiliser l'outil Java jar. Liste le contenu du fichier jar dans un fichier txt et vous pouvez voir toutes les classes dans le jar.

jar tvf jarfile.jar
150
Sanjeev Gupta

Peut-être recherchez-vous la commande jar pour obtenir la liste des classes dans le terminal, 

$ jar tf ~/.m2/repository/org/Apache/spark/spark-Assembly/1.2.0-SNAPSHOT/spark-Assembly-1.2.0-SNAPSHOT-hadoop1.0.4.jar 
META-INF/
META-INF/MANIFEST.MF
org/
org/Apache/
org/Apache/spark/
org/Apache/spark/unused/
org/Apache/spark/unused/UnusedStubClass.class
META-INF/maven/
META-INF/maven/org.spark-project.spark/
META-INF/maven/org.spark-project.spark/unused/
META-INF/maven/org.spark-project.spark/unused/pom.xml
META-INF/maven/org.spark-project.spark/unused/pom.properties
META-INF/NOTICE

où, 

-t  list table of contents for archive
-f  specify archive file name

Ou, juste grep ci-dessus result pour voir .classes seulement

$ jar tf ~/.m2/repository/org/Apache/spark/spark-Assembly/1.2.0-SNAPSHOT/spark-Assembly-1.2.0-SNAPSHOT-hadoop1.0.4.jar | grep .class
org/Apache/spark/unused/UnusedStubClass.class

Pour voir le nombre de classes, 

jar tvf launcher/target/usergrid-launcher-1.0-SNAPSHOT.jar | grep .class | wc -l
61079
18
prayagupd

C'est un hack que j'utilise:

Vous pouvez utiliser la complétion automatique de Java comme ceci:

Java -cp path_to.jar <Tab>

Cela vous donnera une liste de classes disponibles à passer comme classe de départ. Bien sûr, essayer d’en utiliser un qui n’a pas de fichier principal ne fera rien, mais vous pouvez voir comment Java pense que les classes du .jar sont appelées.

9
stanm

Vous pouvez utiliser le 

jar tf example.jar
6
Achyuth

La commande ci-dessous répertorie le contenu d'un fichier jar

commande: - unzip -l jarfilename.jar.

échantillon o/p: - 

Archive: hello-world.jar Length Date Time Name --------- ---------- ----- ---- 43161 10-18-2017 15:44 hello-world/com/AMI/so/search/So.class 20531 10-18-2017 15:44 hello-world/com/AMI/so/util/SoUtil.class --------- ------- 63692 2 files

Selon le manuel de unzip 

-l liste les fichiers d’archive (format court). Les noms, tailles de fichiers non compressés et dates et heures de modification des fichiers spécifiés sont imprimé, avec les totaux pour tous fichiers spécifiés. Si UnZip a été compilé avec OS2_EAS défini, l'option -l répertorie également les colonnes pour les tailles d'OS/2 stocké Attributs étendus (EA) et accès OS/2 listes de contrôle (ACL). De plus, le commentaire zipfile et les commentaires de fichier individuels (le cas échéant) sont affichés. Si un fichier était archivé à partir d'un système de fichiers à cas unique (par exemple, l'ancien système de fichiers FAT MS-DOS) et l'option -L a été donnée, le nom du fichier est converti en minuscule et vaut préfixé par un curseur (^).

5
Amit Khandelwal

Tu peux essayer:

jar tvf jarfile.jar 

Cela ne sera utile que si votre jar est exécutable, c'est-à-dire que vous avez défini une classe comme classe principale

4
Pallav

Vous pouvez essayer ceci:

unzip -v /your/jar.jar

Cela ne sera utile que si votre jar est exécutable, c'est-à-dire que vous avez défini une classe comme classe principale

2
Abhimanyu Dutta

Description OF Solution : Eclipse IDE peut être utilisé à cet effet en créant un exemple de projet Java et en ajoutant tous les fichiers JAR dans le chemin de génération du projet

ÉTAPES ci-dessous :

  1. Créez un exemple de projet Java Eclipse.

  2. Tous les pots que vous avez dans son chemin de construction

  3. CTRL + SHIFT + T et tapez le nom complet de la classe.

  4. Les résultats seront affichés dans la fenêtre avec tous les pots ayant cette classe. Voir la photo ci-jointe. enter image description here

0