es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Tener dos JAR diferentes con la misma clase de Java y el mismo nombre completamente calificado.

Estoy desplegando un archivo JAR en la carpeta WEB-INF\lib de Tomcat y las clases o JavaBeans referenciados en dichos JAR están siendo consumidos correctamente por otras partes del código Java en la aplicación web.

Cuando repetí los mismos pasos en una máquina diferente (UAT), con otra instancia similar de servidor Tomcat (para probar la aplicación en UAT), obtuve un error que indicaba que la clase está duplicada en dos archivos JAR, pero no recuerdo el error exacto. Miré la carpeta WEB-INF\lib y me tomó un esfuerzo extenso localizar el archivo JAR culpable y eliminarlo de la carpeta, y todo funcionó bien.

Lo extraño es que el mismo despliegue se repetió en el entorno de pruebas (para verificar antes del despliegue en producción) y no obtuve el error, y todo funcionó bien, a pesar de que había otro archivo JAR con la misma clase y mismos nombres de paquetes.

Preguntas:
– Si hay múltiples referencias a la misma clase de Java en más de un archivo JAR, ¿cómo podemos confirmar cuál es la selección del servidor Tomcat? Puedo verificarlo revisando el registro y buscando palabras clave que envío al registro usando declaraciones de depuración. ¿Pero cómo verificar eso desde Tomcat?

  • ¿Cómo puedo buscar en todos los JAR de la carpeta de librerías una posible referencia duplicada de la clase o paquete de Java?
    La respuesta se proporciona aquí: https://stackoverflow.com/a/1343026

  • ¿Por qué en una instancia se lanzó el error de declaración de clase duplicada y en otra instancia no, aunque debería haber sido lanzado?

  • ¿Hay alguna configuración para indicar si hay declaraciones de clase duplicadas en múltiples JARs para resolver la referencia siguiendo ciertos criterios? ¿Dónde está dicha configuración?

  • ¿Cuáles son las prácticas recomendadas para desplegar el archivo JAR con una nueva versión de la clase? ¿Es suficiente con copiar/pegar el nuevo JAR y reemplazar el archivo existente?

Agradezco su ayuda.
Tarek

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Respuestas:

    1. ¿Cómo verificar qué archivo JAR está siendo utilizado por el servidor Tomcat cuando hay múltiples referencias a la misma clase Java en más de un archivo JAR?

    Cuando hay múltiples archivos JAR que contienen la misma clase de Java, Tomcat selecciona el primero encontrado en CLASSPATH. Para verificar qué archivo JAR se carga, puede seguir los siguientes pasos:

    1. Inicie Tomcat con la opción verbose:class: java -verbose:class -jar <path_to_tomcat>/bin/bootstrap.jar start
    2. Busque en los registros de Tomcat el nombre de la clase que le interese.
    3. Busque en los registros la ruta de archivo asociada con esa clase. Esto debería revelar el archivo JAR desde el cual se cargó la clase.

    2. ¿Cómo buscar en todos los JAR del folder lib por una posible referencia duplicada de la clase o paquete Java?

    Puede utilizar una herramienta como jarfinder o jarscan para buscar clases o paquetes Java duplicados en los archivos JAR en la carpeta lib. Alternativamente, puede utilizar el siguiente comando para listar todos los archivos JAR en la carpeta lib y buscar referencias duplicadas de clases o paquetes Java:

    for /r %f in (*.jar) do echo %~nxf & jar tf %f | grep <nombre_de_clase>
    

    Esto listará los nombres de archivo JAR y su contenido que contienen el nombre de la clase Java especificada.

    3. ¿Por qué se produjo el error de declaración de clase duplicada en una instancia pero no en otra instancia?

    Una posible razón por la cual el error de declaración de clase duplicada no ocurrió en una instancia pero sí en otra instancia podría ser debido al orden de carga de clases. El orden en que se cargan los archivos JAR puede ser diferente en diferentes instancias, lo que provoca la carga de una clase desde un archivo JAR diferente.

    4. ¿Existe una configuración para indicar si hay declaraciones de clases duplicadas en múltiples JAR para resolver la referencia siguiendo ciertos criterios? ¿Dónde está dicha configuración?

    Sí, puede configurar Tomcat para resolver las declaraciones de clases duplicadas en múltiples JAR. Una forma de hacerlo es estableciendo el atributo delegate del elemento Loader en true en el archivo context.xml. Este atributo indica a Tomcat que delegue la carga de clases al cargador de clases principal primero, antes de intentar cargar la clase desde su propio repositorio. Si se establece en false, la clase se cargará primero desde el repositorio de la aplicación web, lo que puede provocar declaraciones de clases duplicadas.

    <context>
      <loader delegate="true"></loader>
    </context>
    

    5. ¿Cuáles son las prácticas recomendadas para implementar el archivo JAR con una nueva versión de la clase? ¿Es simple copiar y pegar el nuevo JAR y reemplazar el archivo existente?

    La práctica recomendada para implementar un archivo JAR con una nueva versión de la clase es asegurarse de que el nuevo archivo JAR tenga un número de versión diferente al existente. Esto ayuda a evitar conflictos cuando Tomcat intenta cargar la clase desde el repositorio.

    No se recomienda simplemente copiar y reemplazar el archivo JAR existente. En su lugar, se recomiendan los siguientes pasos:

    1. Detenga el servidor Tomcat
    2. Elimine el archivo JAR existente de la carpeta lib
    3. Copie el nuevo archivo JAR en la carpeta lib.
    4. Reinicie el servidor Tomcat.

    Esto asegura que el nuevo archivo JAR se cargue correctamente y sin conflictos.

Comments are closed.