¿Evitar conflictos de versión de dependencia?

10

Cualquier proyecto Java que use mi jar, seguramente tendrá una dependencia adicional en otro jar, que mi jar también contiene como dependencia.

El problema es que ese otro jar tiene múltiples versiones.

¿Cómo puedo evitar cualquier problema que pueda surgir, en el caso probable de que la versión de su proyecto del segundo jar sea diferente de la versión de mi jar del segundo jar?

No quiero que mis usuarios tengan la molestia adicional de hacer algún truco elegante de carga de clases para agregar mi jar.

¿Debo hacer un montón de versiones diferentes de mi jar, para cada versión posible de esa dependencia común? ¿Y luego simplemente eliges la versión de mi jar que usa la misma versión del segundo jar que ya tienes?

¿Existe una forma más inteligente de manejar esto y facilitar que las personas usen mi jarra sin conflictos?

Desalentador
fuente

Respuestas:

10

No es tu problema. Depende de su usuario final resolver. Solo viene con el territorio del uso de dependencias de terceros, y he tenido que resolver conflictos de dependencia más veces de las que cuento. No puede esperar acomodar los conflictos de dependencia específicos de cada proyecto.

Su software debe funcionar correctamente con las últimas versiones de sus dependencias. A menos que la dependencia cambie su interfaz en cada versión, debe tener un rango de compatibilidad (por ejemplo, su software funciona para todas las versiones de dep dentro del rango [2.0.0, 3.0.0)). Mientras mantenga el software, debe intentar mantenerlo compatible con la última versión de todas sus dependencias.

Dicho esto, aquí hay algunas cosas que encontraría útiles como desarrollador que usa su software con mi versión diferente de su dependencia.

  • Si la integración entre su proyecto y otro proyecto es limitada, es útil tener un cuadro de compatibilidad en su documentación. De todos modos, debe mencionar cualquier problema conocido con versiones específicas de la dependencia en su documentación. De lo contrario, los desarrolladores deben encontrar una versión compatible por prueba y error.
  • Resuma la colaboración con la dependencia a través de una interfaz y diseñe su software para que la implementación se pueda sustituir por inyección de dependencia. Eso me permite, como usuario final, sustituir mi propia integración con la versión x de la biblioteca sin molestarlo.
  • Tenga un rastreador de problemas públicos para que sus usuarios puedan pedirle que admita ciertas versiones de la dependencia común. Si encuentra que muchos usuarios desean soporte para una versión incompatible de la dependencia, puede publicar versiones para ambos. Vea este ejemplo de Maven donde se dirigen a múltiples plataformas: el soporte para diferentes versiones de una dependencia debería ser similar.
Samuel
fuente
¿Tiene Java algo así como la configuración del ensamblaje vinculanteRedirect App.config en .NET donde puede especificar "las bibliotecas que solicitan dependencia Foo v3.0.2 realmente deberían usar Foo v3.0.5 y pretender que es v3.0.2"? No he hecho Java en más de 11 años, así que mi recuerdo de cómo maneja esto es solo IDA.
John Zabroski