tag - Mezcla de diferentes versiones de bibliotecas de Java
taglib taglib uri (5)
Mi proyecto utiliza bibliotecas de Java que tienen sus propias dependencias (Hadoop, Jetty, por ejemplo). Termino con diferentes versiones de las mismas dependencias, como ant 1.4.5, 1.4.6. Mi proyecto puede querer usar la hormiga 1.4.7. Este es un pequeño ejemplo, puede volverse más complicado con dependencias más grandes como HTTP Commons.
¿Cómo consigo que todas las bibliotecas y dependencias jueguen bien? ¿Hay alguna forma de aislar cada biblioteca (Hadoop, Jetty) para que solo utilicen sus dependencias?
JG mencionó OSGi, que fue mi primer pensamiento al leer esta pregunta.
Tener múltiples versiones de la misma biblioteca es un punto fuerte en OSGi. Si ya mencionamos algunos productos de terceros, creo que es justo mencionar la especificación que lo respalda.
Puede obtenerlo en el sitio oficial de osgi http://osgi.org
Maven generalmente también manejará esto bastante bien. Si no es completamente, al menos se encargará de la mayor parte del problema, entonces puedes resolver los problemas que quedan.
Por supuesto, eso significa que tienes que cambiar tu proceso de construcción, pero valdría la pena que no te retires el cabello por esto.
Si tienes el código fuente, compila todo junto. Si no lo hace, desafortunadamente tendrá que apuntar a su fuente para el denominador común más bajo con la opción de destino a javac. Solo tiene que hacer esto si hay problemas reales al ejecutar la aplicación, que rara vez debería ser siempre que el jvm sea una versión actual (Java es muy estricto con respecto a la compatibilidad binaria con versiones anteriores).
JarJar al rescate!
Una ant considera que: 1) empaqueta muchos frascos en uno, y 2) le permite cambiar el nombre de las dependencias en los archivos de clase y cargar así dos versiones de la misma biblioteca.
Puede optar por administrar todos estos con un marco de gestión de la dependencia, como OSGI. Eche un vistazo a los módulos dinámicos del marco de primavera http://www.springsource.org/osgi
También puede echar un vistazo a la parte del marco donde Eclipse implementa OSGI. Eche un vistazo aquí http://www.eclipse.org/osgi/
La respuesta corta es solo para obtener el mínimo común denominador. Recuerde que el directorio ''endosado'' es su amigo, cuando se trata de administrar dependencias conflictivas.