Pregunta

Tengo una pregunta interesante sobre el comportamiento del cargador de clases.

Primera pregunta:? ¿Cuál es el orden en que el cargador de clases se carga frascos

se dan los siguientes tarros y que contienen clases:

a.jar
  +-com/scheffield/foo/A.class

b.jar
  +-com/scheffield/foo/B.class

¿Qué se cargará clase?

Segunda pregunta:? ¿Es cierto que la ruta y el nombre de un archivo en la ruta de clase es única

se dan los siguientes tarros y que contienen clases (ejemplo del mundo real):

spring-beans-3.0.3.RELEASE.jar
  +-META-INF/spring.schemas

spring-aop-3.0.3.RELEASE.jar
  +-META-INF/spring.schemas

Lo que puedo decir es que ambos archivos se pueden cargar en la primavera de lo contrario se produciría una excepción (ver este artículo ).

¿Por qué estoy pidiendo que:

Me hizo un llamado frasco grande ( libro de cocina entrada para Gradle ). Eso es un frasco con las clases de la aplicación y todas las demás dependencias descomprimido y el paquete en el frasco grande. Y no estoy absolutamente seguro de qué hacer con los archivos duplicados.

¿Fue útil?

Solución

  1. Las clases se resuelve sin embargo un cargador de clases quiere resolverlos (que es el punto de tener una arquitectura de cargador de clases). La mayoría de los cargadores de clases las que trata en la práctica son variantes de java.net .URLClassLoader qué clases de cargas (y recursos) en base a una ruta de búsqueda (ruta de clase) de los directorios y tarros. Cada ubicación en la ruta de búsqueda se trata como una fuente de las clases y los lugares se buscan en orden.

  2. No, nombres no son únicos. se utilizará el primero encontrado en el orden de búsqueda.

Si se combinan los frascos en un frasco grande hay una clara posibilidad de conflicto. Si usted tiene cuidado para fundirlas desde la última fuente en su ruta de clase efectiva a los (frascos reemplazando así las posteriores con frascos anteriores) primero, se obtiene aproximadamente el mismo resultado.

Yo digo aproximadamente porque manifiesta en frascos contienen instrucciones de procesamiento adicionales que sea necesario combinarlos también. Por ejemplo, un manifiesto puede contener un Class-Path atributo que incluye frascos adicionales en la ruta de clase. Es posible fusionar frascos sino atributos lose manifiestan que están especificando parte de la ruta de clases necesaria real. Si contiene el manifiesto sellada o firmado frascos, entonces no podría ser capaz de hacer esta fusión en absoluto sin violar las piezas firmadas el tarro.

En resumen, los frascos no son realmente diseñado para ser fusionado de esta manera. Puede funcionar, pero hay muchas posibilidades de error, algunos de los cuales no son posibles de resolver. Una causa común de error es fusionar dos archivos jar y terminar con más de una entrada con la misma ruta, que se deja en zip archivos. Las tareas del tarro y de la cremallera de hormigas le permiten combinar múltiples fuentes y puede producir este tipo de problemas.

En realidad, es mejor a aplicaciones web en lugar de paquete que consta de muchos frascos y fuentes en un único archivo WAR o EAR. Eso es algo de toda la cuestión de por qué existen.

Otros consejos

  1. los archivos se están cargando en el orden de los frascos que contienen aparecen en la ruta de clase. esto se aplica a las clases. si está cargando otros recursos (como el spring.schema) se puede usar ya sea classloader.getResource (...) o classloader.getResources (...). el primero returnes el primer recurso en la ruta de clases, la segunda también returnes recursos sombreadas.
  2. No creo que un archivo zip válido contiene entradas duplicadas.

lo que respecta

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top