Comment obtenir des noms de classes dans un fichier jar?

J’ai un fichier JAR et je dois obtenir le nom de toutes les classes dans ce fichier JAR. Comment puis je faire ça?

Je l’ai googlé et j’ai vu quelque chose à propos de JarFile ou de Java ClassLoader mais je n’ai aucune idée de comment le faire.

Malheureusement, Java ne fournit pas un moyen facile de lister les classes dans le JRE “natif”. Cela vous laisse quelques options: (a) pour un fichier JAR donné, vous pouvez répertorier les entrées dans 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 dans /path/to/jar/file.jar .

 List classNames = new ArrayList(); 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? Ssortingng className = entry.getName().replace('/', '.'); // including ".class" classNames.add(className.subssortingng(0, className.length() - ".class".length())); } } 

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

Goyave

Guava a eu ClassPath depuis au moins 14.0, que j’ai utilisé et aimé. Une chose intéressante à propos de ClassPath est qu’il ne charge pas les classes qu’il trouve, ce qui est important lorsque vous parsingz 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

Je n’ai pas personnellement utilisé la bibliothèque Reflections , mais cela semble bien aimé. Certains excellents exemples sont fournis sur le site Web, comme cette méthode rapide pour charger toutes les classes d’un paquet fourni par un fichier JAR, ce qui peut également être utile pour votre application.

 Reflections reflections = new Reflections("my.project.prefix"); Set> subTypes = reflections.getSubTypesOf(SomeType.class); Set> annotated = reflections.getTypesAnnotatedWith(SomeAnnotation.class); 

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

 jar tvf jarfile.jar 

Vous cherchez peut-être une 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 résultat pour voir .class es 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 class es,

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

C’est un hack que j’utilise:

Vous pouvez utiliser la saisie semi-automatique de java comme ceci:

 java -cp path_to.jar  

Cela vous donnera une liste des classes disponibles à passer en tant que 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 ce que java pense que les classes à l’intérieur de .jar sont appelées.

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, la taille des fichiers non compressés et les dates et heures de modification des fichiers spécifiés sont imprimés, ainsi que les totaux pour tous les 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 des atsortingbuts étendus OS / 2 stockés et des listes de contrôle d’access OS / 2. De plus, le commentaire de fichier zip et les commentaires de fichiers individuels (le cas échéant) sont affichés. Si un fichier a été archivé à partir d’un système de fichiers à cas unique (par exemple, l’ancien système de fichiers MS-DOS FAT) et que l’option -L a été spécifiée, le nom de fichier est converti en minuscule et précédé d’un caret (^).

Tu peux essayer:

 jar tvf jarfile.jar 

Cela ne sera utile que si votre fichier jar est exécutable, c’est-à-dire que dans le manifeste, vous avez défini une classe comme classe principale.

Vous pouvez utiliser le

 jar tf example.jar 

Vous pouvez essayer ceci:

 unzip -v /your/jar.jar 

Cela ne sera utile que si votre fichier jar est exécutable, c’est-à-dire que dans le manifeste, vous avez défini une classe comme classe principale.

Description OF Solution : Eclipse IDE peut être utilisé pour cela en créant un exemple de projet Java et en ajoutant tous les jars dans le chemin de la construction du projet.

ÉTAPES cidessous :

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

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

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

  4. Les résultats seront affichés dans la fenêtre avec tous les jars ayant cette classe. Voir la photo ci-jointe. entrer la description de l'image ici