2010-01-19 10 views
7

En el entorno de Eclipse, tengo el proyecto A. A tiene dependencias con proyectos o bibliotecas B y C. (no importa si son proyectos o bibliotecas) B tiene dependencia de LibX.v1 y C tiene dependencia de LibX.v2. Durante el tiempo de ejecución, A necesitará B.jar y C.jar. También las clases en B.jar necesitarán LibX.v1 y las clases en C.jar necesitarán LibX.v2. Siendo las diferentes versiones de la misma biblioteca, LibX.v1 y LibX.v2 tienen las mismas clases, por lo que es posible que una clase se cargue desde la versión incorrecta de la biblioteca en el tiempo de ejecución, causando muchos problemas. ¿Cómo manejo este tipo de situaciones?Administración de dependencias a múltiples versiones de una biblioteca en Java y Eclipse

Saludos cordiales Seref

+1

un consejo: no vaya a OSGi a menos que esté absolutamente seguro de que puede manejarlo. Es más que solo "múltiples versiones de dependencias" – Bozho

Respuesta

4

En realidad, no lo hace. La mayoría de los cargadores de clases Java no ofrecen ninguna garantía sobre el orden en que se cargarán las bibliotecas, por lo que realmente debe asegurarse de no duplicar las dependencias en su ruta de clase. Verificaría si B o C podrían actualizarse a una versión más nueva, o si LibX es completamente compatible con versiones anteriores.

Editar: en realidad, encontré algo que puede ayudarle. Se llama OSGi, y no lo he usado, pero parece que podría hacer lo que intentas hacer. Aquí hay un link a un artículo de introducción.

+0

De hecho, OSGI parece ser la única forma. Este es un problema muy frecuente si está trabajando en proyectos de código abierto. Supongo que estaré trabajando en OSGI en serio. ¡Gracias! (en realidad iba a actualizar esto diciendo que encontré esto: http://stackoverflow.com/questions/1553567/java-classloader-how-to-reference-different-versions-of-a-jar) Saludos Seref – mahonya

+0

La primera clase que se encuentra en el classpath impedirá que JVM cargue más clases con el mismo nombre, ¿puede esto considerarse una garantía? –

3

tendrá que utilizar un mecanismo de 'cargador de varias clases' (que es lo que OSGI es capaz de hacer). En tal escenario, el cargador de clases para la clase B solo puede ver LibX.v1, mientras que el cargador de clases C solo ve LibX.v2. Puede hacerlo con OSGI, pero OSGI es mucho más que esto y no es trivial para empezar.

Otro marco de plug-in es JPF, que también ofrece mucho más que el simple uso de varios cargadores de clases. Creo que ambos utilizan el principio de 1 cargador de clases por plug-in (módulo, lo que sea, ...)

tal vez echar un vistazo a classworlds. Creo que es posible hacerlo con esta biblioteca. el beneficio es que se enfoca en el aspecto de la carga de clases. la documentación no es tan buena classworlds usa la noción de reinos de clase. eche un vistazo al ejemplo de uso de API en el sitio. Agregaré un ejemplo aquí si encuentro uno. de todos modos, ninguna solución trivial para esto creo

resolverlo con la gestión de la dependencia es la mejor solución, por supuesto, pero no siempre es posible.

+0

Hola, gracias por el puntero jpf, lo estaré revisando. En este caso, no tengo muchas opciones. Tengo bibliotecas a la mano, con sus referencias a diferentes versiones de las mismas bibliotecas. Le agradecería si pudiera dar una idea de lo que quiere decir con la gestión de la dependencia. Saludos cordiales Seref – mahonya

+0

básicamente, la gestión de dependencias le permite declarar (configurar) las bibliotecas de las que depende su proyecto.hacer una búsqueda en 'maven' o 'ivy' para más información. cómo gestiona su proyecto y sus dependencias, ¿tiene el JAR almacenado en los proyectos de Eclipse? también, ¿hay alguna razón específica por la cual ambos proyectos deberían usar una versión diferente de LibX? de lo contrario, podría resolver su problema con Ivy o Maven porque es posible usar solo una versión de LibX y excluir la otra. –

Cuestiones relacionadas