¿Cómo obtener nombres de clases dentro de un archivo jar?

Tengo un archivo JAR y necesito obtener el nombre de todas las clases dentro de este archivo JAR. ¿Cómo puedo hacer eso?

Busqué en Google y vi algo sobre JarFile o Java ClassLoader pero no tengo ni idea de cómo hacerlo.

Desafortunadamente, Java no proporciona una manera fácil de enumerar las clases en el JRE “nativo”. Esto te deja con un par de opciones: (a) para cualquier archivo JAR dado, puedes enumerar las entradas dentro de ese archivo JAR, encontrar los archivos .class y luego determinar qué clase Java representa cada archivo .class ; o (b) puede usar una biblioteca que hace esto por usted.

Opción (a): escanear archivos JAR manualmente

En esta opción, classNames con la lista de todas las clases de Java contenidas dentro de un archivo jar en /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? String className = entry.getName().replace('/', '.'); // including ".class" classNames.add(className.substring(0, className.length() - ".class".length())); } } 

Opción (b): usar bibliotecas de reflexiones especializadas

Guayaba

Guava ha tenido ClassPath desde al menos 14.0, que he usado y me ha gustado. Una cosa buena de ClassPath es que no carga las clases que encuentra, lo cual es importante cuando escaneas para un gran número de clases.

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

Reflexiones

No he usado personalmente la biblioteca Reflections , pero parece muy querido. Se proporcionan algunos ejemplos excelentes en el sitio web como esta forma rápida de cargar todas las clases en un paquete proporcionado por cualquier archivo JAR, que también puede ser útil para su aplicación.

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

Puede usar la herramienta Java jar . Lista el contenido del archivo jar en un archivo txt y puedes ver todas las clases en el contenedor.

 jar tvf jarfile.jar 

Tal vez estés buscando el comando jar para obtener la lista de clases en 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 

dónde,

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

O simplemente, grep por encima del resultado para ver solo .class es

 $ 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 

Para ver el número de class ,

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

Este es un truco que estoy usando:

Puedes usar el autocompletado de java esta manera:

 java -cp path_to.jar  

Esto le dará una lista de las clases disponibles para aprobar como clase de inicio. Por supuesto, tratar de usar uno que no tenga un archivo principal no hará nada, pero se puede ver qué java piensa que se llaman las clases dentro de .jar .

Debajo del comando se mostrará el contenido de un archivo jar .

comando: – unzip -l jarfilename.jar .

muestra 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

De acuerdo con el manual de unzip

-l lista archivos de archivo (formato corto). Se imprimen los nombres, los tamaños de archivo sin comprimir y las fechas y fechas de modificación de los archivos especificados, junto con los totales de todos los archivos especificados. Si se compiló UnZip con OS2_EAS definido, la opción -l también enumera las columnas para los tamaños de los atributos extendidos (EA) OS / 2 almacenados y las listas de control de acceso (ACL) OS / 2. Además, se muestran el comentario del archivo zip y los comentarios de archivos individuales (si corresponde). Si se archivó un archivo desde un sistema de archivos de un solo caso (por ejemplo, el antiguo sistema de archivos FAT de MS-DOS) y se dio la opción -L, el nombre del archivo se convierte a minúsculas y se le agrega un símbolo de intercalación (^).

Puedes probar:

 jar tvf jarfile.jar 

Esto será útil solo si tu jar es ejecutable, es decir, en manifiesto has definido alguna clase como clase principal

Puedes usar el

 jar tf example.jar 

Puedes intentar esto:

 unzip -v /your/jar.jar 

Esto será útil solo si tu jar es ejecutable, es decir, en manifiesto has definido alguna clase como clase principal

Descripción de la solución : Eclipse IDE se puede usar para esto creando un proyecto Java de ejemplo y agregando todos los archivos jar en la ruta de Project Build

PASOS a continuación :

  1. Cree una muestra de proyecto Eclipse Java.

  2. Todos los jarrones que tienes en su ruta de comstackción

  3. CTRL + MAYÚS + T y escribe el nombre de clase completo.

  4. Los resultados se mostrarán en la ventana con todos los flasks que tengan esa clase. Ver imagen adjunta . enter image description here