carpeta - obtener la ruta de mi proyecto en java
¿Cómo obtener nombres de clases dentro de un archivo jar? (9)
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 (^).
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<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): 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<Class<? extends SomeType>> subTypes = reflections.getSubTypesOf(SomeType.class);
Set<Class<?>> annotated = reflections.getTypesAnnotatedWith(SomeAnnotation.class);
Este es un truco que estoy usando:
Puedes usar el autocompletado de java
esta manera:
java -cp path_to.jar <Tab>
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
.
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
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
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
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
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 :
Cree una muestra de proyecto Eclipse Java.
Todos los jarrones que tienes en su ruta de compilación
CTRL + MAYÚS + T y escribe el nombre de clase completo.
Los resultados se mostrarán en la ventana con todos los frascos que tengan esa clase. Ver imagen adjunta .