¿Estás usando algún IDE? Ya que se mostrará automáticamente si estás usando uno.
joey rohan
Estoy usando Eclipse, pero necesito hacer esto con código.
sticksu
@LuiggiMendoza: el posible duplicado tiene respuestas con ejemplos y recursos para la documentación. La búsqueda de uno de esos nombres de clase + ejemplo producirá varios resultados útiles.
Aiias
@Alias, el posible duplicado indica cómo encontrar y obtener un archivo de un jar, mientras que la pregunta es sobre cómo obtener los nombres de las clases dentro de un jar (posiblemente las clases en todos los paquetes dentro de él). El enlace en la respuesta de ErikKaju apunta a una posible solución usando JarInputStreamy JarEntryclases que no puedo encontrar en ninguna respuesta de su enlace referido.
Luiggi Mendoza
Respuestas:
68
Desafortunadamente, Java no proporciona una manera fácil de listar clases en el JRE "nativo". Eso le deja con un par de opciones: (a) para cualquier archivo JAR dado, puede enumerar las entradas dentro de ese archivo JAR, encontrar los .classarchivos y luego determinar qué clase Java .classrepresenta cada archivo; o (b) puede usar una biblioteca que lo haga por usted.
Opción (a): escanear archivos JAR manualmente
En esta opción, completaremos classNamescon la lista de todas las clases de Java contenidas dentro de un archivo jar en /path/to/jar/file.jar.
List<String> classNames =newArrayList<String>();ZipInputStream zip =newZipInputStream(newFileInputStream("/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
Guava ha tenido ClassPathdesde al menos 14.0, que he usado y me ha gustado. Una cosa buena ClassPathes que no carga las clases que encuentra, lo cual es importante cuando se busca una gran cantidad 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. En el sitio web se proporcionan algunos ejemplos excelentes, 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.
Gracias. Esto responde a la parte de "solo obtenga una lista de clases" del OP que no se pidió.
octopusgrabbus
9
También se puede utilizar unzip -l jarfile.jaren caso de apuro. ¡Un archivo JAR es solo un archivo zip con un manifiesto!
firmado
3
El problema es que probablemente quería obtener los archivos de clase dentro de un jar en tiempo de ejecución, dada una instancia de cargador de clases (es probable que vea qué clases se cargan dentro de ese jar específico).
Richard Duerr
19
Tal vez esté buscando un jarcomando para obtener la lista de clases en la terminal,
esto era exactamente lo que necesitaba, incluso si el propietario de la pregunta necesitaba una solución basada en código. ¡Gracias!
providencemac
10
Este es un truco que estoy usando:
Puede usar javael autocompletado de esta manera:
java -cp path_to.jar <Tab>
Esto le dará una lista de clases disponibles para pasar como clase inicial. Por supuesto, intentar usar uno que no tiene un archivo principal no hará nada, pero puedes ver cómo se llaman javalas clases dentro del .jar.
Agregue un ejemplo específico en un frasco de ejemplo a su respuesta.
Juru
4
El siguiente comando mostrará una lista del 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 manual de unzip
-l lista de archivos de almacenamiento (formato corto). Se imprimen los nombres, tamaños de archivo sin comprimir y fechas y horas de modificación de los archivos especificados, junto con los totales de todos los archivos especificados. Si UnZip se compiló con OS2_EAS definido, la opción -l también enumera columnas para los tamaños de los atributos extendidos (EA) de OS / 2 almacenados y las listas de control de acceso (ACL) de OS / 2. Además, se muestran el comentario del archivo zip y los comentarios del archivo individual (si los hay). Si un archivo se archivó desde un sistema de archivos de un solo caso (por ejemplo, el antiguo sistema de archivos FAT de MS-DOS) y se proporcionó la opción -L, el nombre del archivo se convierte a minúsculas y tiene el prefijo de intercalación (^).
Si bien este fragmento de código es bienvenido y puede proporcionar algo de ayuda, sería mucho mejor si incluyera una explicación de cómo y por qué resuelve el problema. Recuerde que está respondiendo la pregunta para los lectores en el futuro, ¡no solo la persona que pregunta ahora! Por favor, editar su respuesta para agregar explicación y dar una indicación de lo que se aplican limitaciones y supuestos.
Toby Speight
2
Puedes probar esto:
unzip -v /your/jar.jar
Esto será útil solo si su jar es ejecutable, es decir, en el manifiesto ha definido alguna clase como clase principal
Descripción de la solución : Eclipse IDE se puede utilizar para esto creando un proyecto java de muestra y agregando todos los archivos jar en la ruta de construcción del proyecto
PASOS a continuación :
Cree un proyecto Java de Eclipse de muestra.
Todos los frascos que tienes en su Build Path
CTRL + MAYÚS + T y escriba el nombre completo de la clase.
Los resultados se mostrarán en la ventana con todos los frascos que tengan esa clase. Ver imagen adjunta .
JarInputStream
yJarEntry
clases que no puedo encontrar en ninguna respuesta de su enlace referido.Respuestas:
Desafortunadamente, Java no proporciona una manera fácil de listar clases en el JRE "nativo". Eso le deja con un par de opciones: (a) para cualquier archivo JAR dado, puede enumerar las entradas dentro de ese archivo JAR, encontrar los
.class
archivos y luego determinar qué clase Java.class
representa cada archivo; o (b) puede usar una biblioteca que lo haga por usted.Opción (a): escanear archivos JAR manualmente
En esta opción, completaremos
classNames
con la lista de todas las clases de Java contenidas dentro de un archivo jar en/path/to/jar/file.jar
.Opción (b): uso de bibliotecas de reflexiones especializadas
Guayaba
Guava ha tenido
ClassPath
desde al menos 14.0, que he usado y me ha gustado. Una cosa buenaClassPath
es que no carga las clases que encuentra, lo cual es importante cuando se busca una gran cantidad de clases.Reflexiones
No he usado personalmente la biblioteca Reflections , pero parece muy apreciada. En el sitio web se proporcionan algunos ejemplos excelentes, 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.
fuente
Puede utilizar la
jar
herramienta Java . Enumere el contenido del archivo jar en un archivo txt y podrá ver todas las clases en el jar.fuente
unzip -l jarfile.jar
en caso de apuro. ¡Un archivo JAR es solo un archivo zip con un manifiesto!Tal vez esté buscando un
jar
comando para obtener la lista de clases en la terminal,dónde,
O simplemente grep sobre el resultado para ver
.class
solo esPara ver el número de
class
es,fuente
Este es un truco que estoy usando:
Puede usar
java
el autocompletado de esta manera:Esto le dará una lista de clases disponibles para pasar como clase inicial. Por supuesto, intentar usar uno que no tiene un archivo principal no hará nada, pero puedes ver cómo se llaman
java
las clases dentro del.jar
.fuente
Puedes usar el
fuente
Puedes probar:
Esto será útil solo si su jar es ejecutable, es decir, en el manifiesto ha definido alguna clase como clase principal
fuente
El siguiente comando mostrará una lista del 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 manual de
unzip
fuente
Puedes probar esto:
Esto será útil solo si su jar es ejecutable, es decir, en el manifiesto ha definido alguna clase como clase principal
fuente
Utilice este script de bash:
esto enumerará las clases dentro de los frascos en su directorio en la forma:
Salida de muestra:
En Windows puede usar powershell:
fuente
Descripción de la solución : Eclipse IDE se puede utilizar para esto creando un proyecto java de muestra y agregando todos los archivos jar en la ruta de construcción del proyecto
PASOS a continuación :
Cree un proyecto Java de Eclipse de muestra.
Todos los frascos que tienes en su Build Path
CTRL + MAYÚS + T y escriba el nombre completo de la clase.
Los resultados se mostrarán en la ventana con todos los frascos que tengan esa clase. Ver imagen adjunta .
fuente
Windows cmd: esto funcionaría si tiene todos los tarros en el mismo directorio y ejecuta el siguiente comando
fuente
Mac OS: en la terminal:
fuente