2012-04-01 15 views
26

Actualmente estoy en el proceso de eliminar la dependencia de Spring de Flyway. En el futuro, podrían necesitarse otros tipos de dependencias para admitir un subconjunto de usuarios (como el soporte JBoss VFS).La mejor estrategia para tratar con dependencias opcionales

¿Cuál es la mejor forma de admitir dependencias opcionales (opcional = verdadero en Maven POM)?

Cualidades de la solución serían:

  • Facilidad de uso para los usuarios finales (trabajo mínimo necesario para utilizar la funcionalidad de si la dependencia está presente)
  • Facilidad de uso para los desarrolladores (código de tratar con la dependencia opcional debe ser lo más fácil de leer y lo más sencillo posible)
  • Sin dependencias requeridas innecesarias (si algún usuario final no necesita esta funcionalidad, no hay necesidad de tirar de la dependencia)
+0

** Actualización: ** sólo para aclarar, las cosas que estoy seguro acerca son - POM diseño - reflexión vs múltiples módulos vs vs tanto ... - autodiscovery o no de módulos adicionales si están presentes/si sí, cómo - ... –

+1

Actualización: finalmente he llegado a escribir una publicación completa sobre este tema: http://www.axelfontaine.com/2012/08/opcional-dependencias-de-estrategia-para-java. html –

Respuesta

11

Creo que la funcionalidad de dependencia opcional de Maven es bastante limitada.

http://maven.apache.org/guides/introduction/introduction-to-optional-and-excludes-dependencies.html

dependencias opcionales no se derrumben (como dependencias transitivas) por defecto. Sin embargo, si sus usuarios necesitan usar estas características opcionales, las dependencias faltantes deben declararse explícitamente en su POM.

Personalmente, no me queda claro cómo esto ayuda a los usuarios ... Supongo que las dependencias opcionales en su POM sí documentan de qué versiones depende su código. Sin embargo, no todos los usuarios leerán el POM, todo lo que verán es el error "NoClassDef Found" :-(

Mi observación final es que este es uno de esos escenarios raros donde un administrador de dependencias como ivy ofrece más flexibilidad. Ivy tiene un concepto llamado "configuraciones" autores de módulos pueden montar diferentes combinaciones de las dependencias, por ejemplo "con resorte" o "sin-primavera"

+0

Buen punto sobre el pom y las versiones de dependencia. ¿Qué pasa con el lado del código de las cosas? ¿Cómo dividir módulos/evitar NoClassDefFound/etc? Por favor expande –

+0

@martiell ha proporcionado una descripción excelente de los tipos de soluciones de trabajo no óptimas disponibles para usted ... Realmente no creo que haya una buena manera de hacerlo en Maven. La implementación de varios módulos Maven, cada uno con su propio POM personalizado, parece ser la mejor y más sencilla opción para sus usuarios (pero más trabajo para usted). –

+0

Dagger 2 tiene un buen uso de . El compilador de anotaciones usa esto para estar disponible durante la compilación, pero no cuando este módulo es utilizado por otros artefactos. –

1

Hay una opción de:..

  • mantener el proyecto en un solo módulo y use dependencias opcionales.
  • divide el proyecto en múltiples módulos; donde cada módulo tiene una dependencia (no opcional) en cualquier biblioteca;

Creo que lo primero tiene más sentido en la mayoría de los casos: los usuarios necesitan encontrar su camino en menos artefactos. Por lo general, deberán agregar menos dependencias nuevas a su pom. A menos que el código para admitir proyectos de terceros sea grande, esto también ayudará a mejorar los tiempos de descarga (menos viajes redondos). Con este último enfoque, puede encontrarse en situaciones incómodas donde el usuario ha definido su propio conjunto de versiones, pero solo para algunas de las dependencias de terceros.

Prefiero ver las dependencias opcionales en el pom (a veces miro para ver en qué versión está construido). Es cierto que algunas personas pueden no mirar. Creo que copiar y pegar fragmentos de pom en el sitio web es la mejor solución para eso. Por ejemplo, si tiene una página sobre la integración de Spring, puede poner el fragmento de pom relevante en esa página.

Sugeriría que las dependencias no libres (o cualquier cosa que no se pueda resolver fácilmente) se guarden en un módulo maven separado, para que los colaboradores siempre puedan construir el artefacto principal. (Tuve ese problema con Quartz, que IIRC tiene una dependencia opcional en un contenedor Oracle JDBC).

Editar: Si le preocupan los usuarios que ven NoClassDefFoundErrors, no haría ningún daño comprobar que la clase se puede resolver antes de intentar usarla. Por ejemplo, podría hacer una excepción y lanzar un mensaje de error más significativo que señale al usuario a la documentación. SLF4J es un buen ejemplo de esto.

Cuestiones relacionadas