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.
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())); } }
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... }
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 ci – dessous :
Créez un exemple de projet Java Eclipse.
Tous les pots que vous avez dans son chemin de construction
CTRL + MAJ + T et tapez le nom complet de la classe.
Les résultats seront affichés dans la fenêtre avec tous les jars ayant cette classe. Voir la photo ci-jointe.