2011-05-26 25 views
8

Soy nuevo en Maven y estoy configurando mi primer proyecto de maven. También estoy creando algunos recursos de maven en la forma de algunos poms que también pueden heredarse o usarse como dependencias en futuros proyectos. Quiero agrupar dependencias y poder agregarlas selectivamente a un proyecto según sea necesario.Crear grupos de dependencia en Maven para su reutilización, incluidas las dependencias 'provistas'

Leo this article en pom mejores prácticas. Me gusta la idea de agrupar las dependencias relacionadas en poms y luego agregar el pom como una dependencia a un proyecto según sea necesario. Este enfoque funciona muy bien para compilar dependencias de ámbito. Sin embargo, falla para los ámbitos provistos, ya que como dependencias transitivas, se omiten.

Aquí hay un ejemplo de lo que quiero decir: Digamos que agrupo dependencias web para mis proyectos en un pom.xml de de-webs. Estos incluyen compile con ámbito dependencias Spring Framework y también un provided con ámbito JavaEE uno:

<modelVersion>4.0.0</modelVersion> 
<groupId>com.xyz</groupId> 
<artifactId>mvn-web-deps</artifactId> 
<version>0.0.1-SNAPSHOT</version> 
<packaging>pom</packaging> 

<dependencies> 
    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-web</artifactId> 
     <version>${org.springframework.version}</version> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-webmvc</artifactId> 
     <version>${org.springframework.version}</version> 
    </dependency> 
    <dependency> 
     <groupId>javaee</groupId> 
     <artifactId>javaee-api</artifactId> 
     <version>${javaee.version}</version> 
     <scope>provided</scope> 
    </dependency> 
</dependencies> 

luego añadir POM como una dependencia en otro proyecto:

<modelVersion>4.0.0</modelVersion> 
<groupId>com.xyz</groupId> 
<artifactId>project-a</artifactId> 
<version>0.0.1-SNAPSHOT</version> 

<dependency> 
    <groupId>com.xyz</groupId> 
    <artifactId>mvn-web-deps</artifactId> 
    <version>0.0.1-SNAPSHOT</version> 
    <type>pom</type> 
</dependency> 

Las dependencias en mvn-web-deps ahora se convierten en transitiva . Dado que la referencia de dependencia anterior es compile con ámbito, la dependencia transitiva provided se omite.

Quiero evitar agregarlos a la sección dependency de un elemento primario, ya que solo puede haber un elemento primario y un proyecto puede necesitar solo algunos de estos grupos de dependencia, no todos. Quizás pueda agregarlos a la sección dependencyManagement, pero luego tendré que redeclarar cada dependencia (sin la versión) en cada proyecto secundario.

¿Cuál es la forma correcta/mejor de agrupar dependencias mientras se evitan los problemas como los de arriba?

Respuesta

6

La respuesta breve a su pregunta es que solo debe incluir las dependencias 'proporcionadas' localmente donde el código lo requiere para compilar, pero no en el pom.xml principal u otras estructuras. Indicar que tiene una dependencia 'proporcionada' en global pom.xml no tiene sentido para maven, porque no necesita compilar en tal pom.xml.

Aquí está la respuesta larga:

Cuando empecé a usar Maven, que tenían la misma idea de tratar de artefactos de grupos y dependencias en módulos pom.xml la esperanza de que serían útiles en el futuro. Ahora que tengo un poco más de experiencia, tengo que entender que es una completa pérdida de tiempo. Para mí, esta fue una forma de exceso de ingeniería.

He aprendido a dividir mis grandes proyectos en módulos separados, cada uno en su propio repositorio de subversión. Estoy incluyendo dependencias según sea necesario para cada módulo local en su pom.xml. Lanzo etiquetas versionadas de cada módulo según estoy codificando y según sea necesario (es decir, cuando se prueban y son estables).

Construyo mis grandes proyectos creando un proyecto maven separado con su propio pom.xml e importo mis módulos como dependencias. De vez en cuando, actualizo la versión del módulo en la dependencia cuando hice una publicación. Luego, dejo que Maven haga el trabajo de sacar todo lo que tenga que extraer, transitoriamente de lo contrario, al compilar/lanzar el gran proyecto.

Maven permite todo tipo de construcciones complejas y la jerarquía entre pom.xmls, pero en mi humilde opinión esta característica crea desorden y complejidades innecesarias. Hasta ahora no ha demostrado ser un beneficio real para mí.Al principio, esperaba que la compilación de un pom.xml compilara el resto correctamente en cascada. Obtuve algunos resultados, pero qué desastre mantener en todo el pom.xml global.

Liberar los artefactos de mi módulo por separado y crear mi proyecto en estos lanzamientos me ha ahorrado tanto tiempo que solo puedo recomendarlo. En total, tengo menos pom.xml para mantener y también son menos complejos. Para obtener el mismo resultado final ...

Por lo tanto, si su única razón para construir pom.xml global/estructural es una esperanza de ahorrar tiempo, le recomiendo que abandone esta idea ... Separe el código en proyectos separados, suelte y ENTONCES compilar globalmente

+0

Gracias por la respuesta. Tal vez no hice que mi motivación para usar tales dependencias agrupadas fuera muy clara. También dividí mis proyectos en módulos. Lo que quiero lograr al agrupar las dependencias relacionadas es la capacidad de administrarlas en un solo lugar y reutilizarlas en todos los proyectos por simple referencia. cont. .. – samitgaur

+0

Tengo un conjunto de tecnologías más o menos fijo que utilizo para desarrollar proyectos web, por ejemplo, en mi organización. Entonces, todos los proyectos web tienen al menos un conjunto común de dependencias que serían obligatorias. Quiero mantenerlos en un solo lugar para que el conocimiento del repositorio, identificación de grupo, identificador de artefactos y números de versión esté localizado y cada desarrollador que inicie un nuevo proyecto web no tiene que preocuparse por ellos y solo puede hacer referencia a estas dependencias de alguna manera . – samitgaur

3

Llegué a la conclusión de que Maven no estaba diseñado para este tipo de caso de uso. Terminé teniendo un padre pom.xml con todas las bibliotecas que uso agregado a su sección <dependencyManagement>. Todos los nuevos proyectos/módulos que creo tienen su pom.xml heredan del padre pom.xml y agregan cada dependencia que necesitan a su propia sección <dependencies>, menos la versión. Este esquema me permite administrar las versiones para las bibliotecas que utilizo y las declaraciones del repositorio que necesitan en un solo lugar. Otra ventaja (al tratar de crear paquetes de dependencias de alguna manera) es que proporciona un control más detallado sobre las bibliotecas agregadas a los poms secundarios, solo se agregan las dependencias que realmente se necesitan.

1

dependencias alcance previsto de hecho se heredan de los padres POM, pero no de POM definen como dependencias y considero que una debilidad Maven.

Dado que Maven también tiene dificultades para agregar módulos como dependencias entre las jerarquías de módulos, no puedo decir que Maven sea una herramienta sofisticada para administrar proyectos de varios módulos. Maven espera una estricta jerarquía de raíz única que solo sea adecuada para los proyectos más simples.

Cuestiones relacionadas