¿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.
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);
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
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 class
es,
jar tvf launcher/target/usergrid-launcher-1.0-SNAPSHOT.jar | grep .class | wc -l
61079
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.
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 (^).
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
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
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
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 :
Cree un proyecto Java de Eclipse de ejemplo.
-
Todos todos los frascos que tienes en su Camino de Construcción
CTRL + SHIFT + T y Escriba el nombre completo de la clase .
Los resultados se mostrarán en la ventana con todos los jars que tengan esa clase. Ver imagen adjunta .
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