¿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?

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

Author: Roman C, 2013-03-30

9 answers

Desafortunadamente, Java no proporciona una manera fácil de listar clases en el JRE "nativo". Esto le deja con un par de opciones: (a) para cualquier archivo JAR dado, puede 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 lo haga por usted.

Opción (a): Escanear archivos JAR manualmente

En esta opción, llenaremos classNames con la lista de todas las clases Java contenidas dentro de un archivo jar en /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()));
    }
}

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

Guayaba

Guayaba ha tenido ClassPath desde al menos 14.0, que he utilizado y me gustó. Una cosa buena de ClassPath es que no carga las clases que encuentra, lo cual es importante cuando estás buscando 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 apreciada. Algunos grandes ejemplos se proporcionan 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<Class<? extends SomeType>> subTypes = reflections.getSubTypesOf(SomeType.class);

Set<Class<?>> annotated = reflections.getTypesAnnotatedWith(SomeAnnotation.class);
 60
Author: sigpwned,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-07-12 18:47:11

Puede utilizar la herramienta Java jar. Enumere el contenido del archivo jar en un archivo txt y podrá ver todas las clases en el jar.

jar tvf jarfile.jar
 140
Author: Sanjeev Gupta,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-03-14 19:51:49

Tal vez usted está buscando jar comando 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

Donde

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

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

$ 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 classes,

jar tvf launcher/target/usergrid-launcher-1.0-SNAPSHOT.jar | grep .class | wc -l
61079
 18
Author: prayagupd,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-10-26 10:42:54

Este es un truco que estoy usando:

Puedes usar el autocompletar de java así:

java -cp path_to.jar <Tab>

Esto le dará una lista de clases disponibles para pasar como clase inicial. Por supuesto, tratar de usar uno que no tenga un archivo principal no hará nada, pero puedes ver lo que java piensa que las clases dentro del .jar son llamadas.

 8
Author: stanm,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-08-05 22:33:52

El siguiente comando listará 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

Según el manual de unzip

- l lista de archivos (formato corto). Los nombres, tamaños de archivo sin comprimir y fechas y horas de modificación de los archivos especificados son impreso, junto con los totales para todos archivos especificados. Si UnZip fue compilado con OS2_EAS definido, la opción-l también enumera columnas para los tamaños de OS/2 almacenados atributos extendidos (EAs) y acceso OS/2 listas de control (ACLs). Además, se muestran los comentarios de archivo zipfile y los comentarios de archivo individuales (si los hay). Si un archivo era archivado desde un sistema de archivos de un solo caso (por ejemplo, el antiguo sistema de archivos MS-DOS FAT) y se dio la opción-L, el nombre del archivo se convierte en minúsculas y es prefijado con un caret (^).

 5
Author: Amit Khandelwal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-10-20 17:19:35

Puedes probar:

jar tvf jarfile.jar 

Esto será útil solo si su jar es ejecutable, es decir, en manifest ha definido alguna clase como clase principal

 3
Author: Pallav,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-10-08 06:49:17

Puede utilizar el

jar tf example.jar
 3
Author: Achyuth,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-10-16 16:44:40

Puedes probar esto:

unzip -v /your/jar.jar

Esto será útil solo si su jar es ejecutable, es decir, en manifest ha definido alguna clase como clase principal

 2
Author: Abhimanyu Dutta,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-02-24 09:44:36

Descripción DE la solución : Eclipse IDE se puede usar para esto creando un proyecto java de ejemplo y agregando todos los jars en la ruta de compilación del proyecto

PASOS a continuación :

  1. Cree un proyecto Java de Eclipse de ejemplo.

  2. Todos todos los frascos que tienes en su Camino de Construcción

  3. CTRL + SHIFT + T y Escriba el nombre completo de la clase .

  4. Los resultados se mostrarán en la ventana con todos los jars que tengan esa clase. Ver imagen adjunta . introduzca la descripción de la imagen aquí

 0
Author: Arokiadoss Asirvatham,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-03-09 03:07:51