2009-09-02 10 views
5

En nuestro proyecto Maven, estamos tratando la siguiente estructura de directorios (con cerca de 80 proyectos en total, sólo unos pocos se muestran de manera que se entiende la idea):Maven reutilización en poms

myappli  (pom) 
-- module1  (pom) 
--|-- utils (pom) 
--|-- ejb  (pom) 
--|--|-- myappli-module1-a-ejb (jar) 
--|--|-- myappli-module1-b-ejb (jar) 
--|-- war  (pom) 
--|-- applet  (pom) 
... 
-- module6  (pom) 
--|-- utils  (pom) 
--|-- ejb  (pom) 
--|--|-- myappli-module6-c-ejb (jar) 
--|-- war  (pom) 
--|-- applet  (pom) 

Nota: Esta es una estructura plana para Maven, ya que todos los proyectos que no son hojas tienen un valor packaging de "pom". (cf BetterBuildsWithMaven book).

Definimos las versiones de dependencia en "dependencyManagement", en el "myappli" pom. Esto funciona bien

Nuestro problema es con la reutilización de las dependencias en sí. Por ejemplo, las dependencias ejb son comunes a todos los proyectos ejb (por diseño). ¡No queremos cortar en pegar, y mantener todo eso con cada cambio!

Estábamos pensando en utilizar alguna "noción de importación" para las dependencias ejb y definir nuestras dependencias ejb una vez en el nivel de la aplicación. Nuestros intentos fallidos fueron:

  • El Maven "parent pom" idea estaría bien, pero ya es utilizado por los módulos, por lo que no está disponible para nuestras necesidades.
  • No se encontraron dispositivos de importación en Maven (excepto por la administración de dependencia)
  • La definición de entidad XML no se reconoce. Probamos un pom como la siguiente, y conseguimos el error
    "Reason: Parse error reading POM. Reason: could not resolve entity named 'ejbDependencies'":

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE project [
    <!ENTITY ejbDependencies SYSTEM "./ejbDependencies.txt">
    ]>
    <project ...
    ...
    &ejbDependencies;
    ...


Editado: Estoy intentando la solución sugerida por Robert, pero algo anda mal.

Cuando compilo mi proyecto ejb, no encuentra las dependencias mismas. Aparece un error al compilar (compilación mvn), diciendo que falta el paquete javax.ejb.

Nota: He ejecutado "mvn install" en el proyecto de dependencias antes.

Esta es mi configuración:

<project ...> 
    <modelVersion>4.0.0</modelVersion> 
    <parent> 
    <groupId>com.company</groupId> 
    <artifactId>myproj-maven</artifactId> 
    <version>3.1-SNAPSHOT</version> 
    </parent> 

    <groupId>com.company</groupId> 
    <artifactId>myproj-maven-ejb</artifactId> 
    <version>${myproj-version}</version> 
    <packaging>pom</packaging> 

    <dependencies> 
    <dependency> 
     <groupId>javax.ejb</groupId> 
     <artifactId>ejb</artifactId> 
    </dependency> 

    <dependency> 
     <groupId>ojdbc</groupId> 
     <artifactId>ojdbc</artifactId> 
    </dependency> 
    </dependencies> 
</project> 

--------------------------------- 
<project ...> 
    <modelVersion>4.0.0</modelVersion> 
    <parent> 
    <groupId>com.company</groupId> 
    <artifactId>myproj-identite-ejb</artifactId> 
    <version>3.1-SNAPSHOT</version> 
    </parent> 

    <groupId>com.company</groupId> 
    <artifactId>myproj-identite-metier</artifactId> 
    <name>SNR IDENTITE METIER</name> 
    <version>2.0.1</version> 
    <packaging>ejb</packaging> 

    <dependencies> 
    <dependency> 
     <groupId>com.company</groupId> 
     <artifactId>myproj-maven-ejb</artifactId> 
     <version>${myproj-version}</version> 
     <type>pom</type> 
    </dependency> 
    </dependencies> 
</project> 

No sé si ha cambiado algo, pero tenemos una jerarquía que relaciona las dos poms.
Tenemos una estructura Maven estricta, donde cada directorio declara todos los subdirectorios como módulos maven, y cada subdirectorio declara el padre como un padre maven.
Y el directorio padre común es parte de esta estructura.

+---maven 
| \---ejb 
+---identite 
| +---ejb 
| | \---SNR_IDENTITE_METIER 

Editado:

La respuesta dada por el filón parece correcto. Es imposible hacerlo con Maven, porque se proporcionan nuestra dependencia, y por lo tanto no transitiva :-(

Realmente tenemos muchos problemas en la configuración de hasta Maven. Así que muchas pequeñas cosas simplemente no funcionan. Hoy me he encontrado ! que el objetivo sitio no puede manejar propiedades, que estamos utilizando para números de versión

Respuesta

2

¿Sus dependencias importadas tienen un alcance de proporcionado? De hecho, este alcance no es transitivo (ver Maven Dependency Scopes).

Este podría ser el motivo de la no sustitución.

+0

+1 es la razón de hecho, una pequeña prueba lo demostró. Gracias. – KLE

9

puede utilizar dependencias del pom importar dependencias en proyectos arbitrarias

Un proyecto POM puede ser similar a:.

<project> 
    <modelVersion>4.0.0</modelVersion> 
    <groupId>com.example</groupId> 
    <artifactId>persistence-deps</artifactId> 
    <version>1.0</version> 
    <packaging>pom</packaging> 

    <dependencies> 
    <dependency> 
     <groupId>org.hibernate</groupId> 
     <artifactId>hibernate</artifactId> 
     <version>${hibernateVersion}</version> 
    </dependency> 
    <dependency> 
     <groupId>org.hibernate</groupId> 
     <artifactId>hibernate-annotations</artifactId> 
     <version>${hibernateAnnotationsVersion}</version> 
    </dependency> 
    </dependencies> 
</project> 

y se importa como:

<dependency> 
    <groupId>com.example</groupId> 
    <artifactId>persistence-deps</artifactId> 
    <version>1.0</version> 
    <type>pom</type> 
</dependency> 

Ver Maven, the definitive guide - Grouping Dependencies para más detalles.

+0

+1 para una respuesta que se ve perfecta. Lo estoy intentando en este momento. (Nota: hace unos minutos, también editó mi "error tipográfico" en otra respuesta ;-)) – KLE

+0

Intenté esto. Ejecuto "mvn install" en el proyecto de dependencias. Luego compilo mi proyecto ejb, no encuentra las dependencias en sí mismas. – KLE

+0

Para verificar, ejecuto una ayuda: effective-pom. No reemplaza la dependencia por el conjunto de dependencias. Es esto normal? ¿Cómo podría verificar dónde estoy equivocado? – KLE