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