Supongamos que tengo 500 archivos jar vinculados a mi programa que suman más de 500 MB (tamaño de todos los archivos jar, no de cada uno) y mi programa realiza una llamada a una clase ubicada en uno de ellos. ¿Cómo busca Java a través de jar para una clase, y cuál es la eficiencia de esto? En)? O (log (n))?¿Cómo busca Java eficientemente los archivos jar para las clases?
Respuesta
Java busca en la estructura de directorios internos del contenedor una coincidencia exacta con el nombre completo. Parece; no busca Si tiene 500 archivos jar en classpath, Java los buscará uno por uno en el orden especificado hasta que encuentre una coincidencia. Si el jar que contiene una clase determinada es el último, Java buscará en los 500 archivos jar. Así que supongo que es O (n).
ACTUALIZACIÓN: El comportamiento descrito anteriormente es el comportamiento predeterminado. Sin embargo, como Hassan señaló, esto se puede optimizar proporcionando un JarIndex en el archivo jar raíz que permite al cargador de clases encontrar el archivo jar apropiado con una búsqueda simple en un nombre de paquete.
De manera predeterminada solía ser lineal; sin embargo, desde JDK 1.3, se puede incrustar un índice JAR en el primer archivo JAR de una aplicación.
Esto significa que si el índice está incrustado en el archivo JAR, el cargador de clases puede encontrar de manera eficiente todas las clases distribuidas en múltiples archivos JAR que pertenecen a la aplicación.
enlace a SUN Resource en JAR Indexing. Nota: los recursos que no son de clase no parecen estar cubiertos.
¿Cree que el uso de índices es común? Creo que aún el comportamiento lineal es el predeterminado, necesita agregar un índice y mucha gente no. – djna
Todas las cremalleras tienen un índice al final del archivo de todos modos, por lo que no hace mucha diferencia. –
hmm, Parece que ANT predetermina http://ant.apache.org/manual/CoreTasks/jar.html a falso para la generación de índices en archivos JAR. Me pregunto qué hacen los IDE. –
- 1. ¿Cómo se usan las clases de los archivos .jar?
- 2. ¿Dónde busca java los archivos?
- 3. Cómo agregar nuevas clases de Java a las clases existentes en el archivo jar
- 4. ¿Cómo extraer los archivos .war en Java? ZIP vs JAR
- 5. ¿Cuándo JVM de Java descomprime archivos jar?
- 6. Método para cargar dinámicamente clases Java archivos
- 7. ¿Dónde se almacenan los archivos jar en caché para las aplicaciones Java Web Start/JNLP?
- 8. Proguard problemas con archivos jar, ¿cómo encontrar el jar faltante?
- 9. Buscar archivos Java jar (ear, war, ...) para la clase/método
- 10. Herramientas para encontrar todas las dependencias en Java jar
- 11. Ejecutar comando jar excluir archivos
- 12. ¿Cómo se firman programáticamente archivos jar en Java?
- 13. Java: en busca de hack para manejar las rutas de archivos de Windows en Linux
- 14. Cómo fusionar eficientemente archivos gigantescos con C#
- 15. Cómo nombrar archivos fuente C# para las clases genéricas
- 16. mapa java para el rango busca
- 17. ¿Precargar clases/bibliotecas Java en el inicio del jar?
- 18. Listar los archivos en un directorio del archivo JAR actual
- 19. ¿Cómo incluyo archivos JAR externos en mi propio proyecto JAR
- 20. ¿Deben comprimirse los archivos jar para aplicaciones de escritorio?
- 21. Protección de archivos jar de Java para la distribución
- 22. importando archivos jar externos
- 23. Anotaciones de auto-cableado en clases de jar dependientes
- 24. ¿Dónde instalar archivos JAR en OS X para que otras aplicaciones Java los encuentren?
- 25. ¿Cómo averiguar los archivos jar de los que dependen las dependencias en pom.xml de maven?
- 26. ¿Cómo extraer clases del archivo .jar?
- 27. ¿Cómo proteger las clases compiladas de Java?
- 28. ¿Cómo instrumentar las clases del sistema Java?
- 29. Java .properties archivos como clases fuertemente tipadas
- 30. Filtrar eficientemente un ArrayList en Java/Android
En Java 7, están intentando canjear eso al admitir un sistema de módulo, similar a OSGi – notnoop
(-1) que la información está desactualizada. –
@Hassan. Los índices son opcionales, el valor predeterminado es de hecho lineal: el nuevo esquema de carga de clases es totalmente retrocompatible con las aplicaciones desarrolladas sobre el mecanismo de extensión actual. Cuando el cargador de clases carga el primer archivo jar y se encuentra un archivo INDEX.LIST en el directorio META-INF, construirá la tabla de índice de hash y usará el nuevo esquema de carga para la extensión. De lo contrario, el cargador de clases simplemente usará el algoritmo de búsqueda lineal original. – djna