reconoce proyecto programa librerias importar ejecuta java jar classloader

java - proyecto - netbeans no ejecuta mi programa



Problemas con Classloader: cómo determinar qué versiones de la biblioteca(archivos jar) están cargadas (5)

Acabo de resolver otro * I-though-I-was-using-this-version-of-a-library-but-aparentemente-my-app-server-has-already-loaded-an-older-version-of -this-library- * problema (suspiro).

¿Alguien sabe una buena manera de verificar (o monitorear) si su aplicación tiene acceso a todos los archivos jar apropiados o versiones de clases cargadas?

¡Gracias por adelantado!

[PD ¡Una muy buena razón para comenzar a usar la arquitectura del módulo OSGi en mi opinión!]

Actualización : ¡ Este artículo ayudó también! Me dio una idea de qué clases cargó el cargador de clases de JBoss escribiéndolas en un archivo de registro.


Debe haber una manera mejor que la forma en que lo hago, pero tiendo a hacer esto de una manera muy manual.

  1. Cada jar debe tener su número de versión en el nombre del archivo (si no cambia su nombre).
  2. cada aplicación tiene su propio classpath.
  3. Debe haber un motivo para comenzar a utilizar un Jar actualizado (nueva versión). No solo cambie porque está disponible, cambie porque le brinda la funcionalidad que necesita.
  4. Cada versión debe incluir todos los Jars necesarios.
  5. Guardo una clase de Versión que conoce la lista de Tarros que necesita (esto está codificado en el archivo de origen) y se puede verificar en tiempo de ejecución contra la lista de Tarros en la ruta de clases.

Como dije, es manual, pero funciona.


En la versión actual de Java, el control de versiones de la biblioteca es un término bastante lanoso que se basa en que el JAR se empaqueta correctamente con un manifiesto útil. Incluso entonces, la aplicación en ejecución necesita mucho trabajo para recopilar esta información de manera útil. El tiempo de ejecución de JVm no te ayuda en absoluto.

Creo que su mejor opción es aplicar esto en tiempo de compilación, utilizando herramientas de administración de dependencias como Ivy o Maven para buscar las versiones correctas de todo.

Curiosamente, Java 7 probablemente incluirá un marco de control de versiones adecuado para precisamente este tipo de cosas. No es que eso te ayude en este momento,


Si está utilizando JBoss, hay un MBean (el repositorio del cargador de clases iirc) donde puede solicitar todos los cargadores de clases que han cargado una clase determinada.

Si todo lo demás falla, siempre habrá ''java -verbose: class'' que imprimirá la ubicación del jar para cada archivo de clase que se esté cargando.


Si tiene información de versiones apropiadas en un manifiesto jar, existen métodos para recuperar y probar la versión. No es necesario leer manualmente el manifiesto.

java.lang.Package .getImplementationVersion () y getSpecificationVersion () y isCompatibleWith () suenan como si hicieran lo que estás buscando.

Puede obtener el paquete con this.getClass (). GetPackage (), entre otras formas.

Javadoc para java.lang.Package no proporciona los nombres de atributos de manifiesto específicos para estos atributos. Una rápida búsqueda en Google lo mostró en http://java.sun.com/docs/books/tutorial/deployment/jar/packageman.html


No creo que haya una buena manera de verificar eso. Y no estoy seguro de que quieras hacer eso. Lo que debe hacer es familiarizarse con la arquitectura de carga de clases de su servidor de aplicaciones y comprender cómo funciona.

Una explicación simplificada de cómo funciona es que un EJB o una aplicación web primero buscará una clase o un recurso en las bibliotecas declaradas en su propio módulo (ejb-jar o war). si la clase no se encuentra allí, el cargador de clases reenvía la solicitud al cargador de clases padre que es una dependencia declarada (por lo general un ejb) o el cargador de clases de la aplicación que es responsable de cargar las bibliotecas y los recursos declarados en el paquete ear . Si aún no se encuentra la clase o el recurso, la solicitud se reenvía al servidor de la aplicación, que buscará en su propia ruta de clases.

Dicho esto, debe recordar que un módulo Java EE (aplicación web, ejb) siempre cargará las clases de un jar que se encuentre en el alcance más cercano. Por ejemplo, si empaqueta log4j v1 en el archivo war, log4j v2 en el nivel ear y coloca log4j v3 en la ruta de clase de su servidor de aplicaciones, el módulo usará el jar en su propio módulo. quítalo y usará el que está al nivel del oído. elimínalo y usará el que está en el classpath del servidor de aplicaciones. Las cosas se vuelven más complicadas cuando tienes dependencias complejas entre módulos.

Lo mejor es poner las bibliotecas globales de la aplicación a nivel del oído.