2012-06-28 26 views
5

Tengo un proyecto de varios módulos en Maven que se compila correctamente, pero no se empaqueta correctamente.Cómo empaquetar proyectos maven de múltiples módulos con módulos anidados

En el experto principal pom.xml, que incluyen los módulos de este tipo:

<modules> 
    <module>module1</module> 
    <module>module1/test</module> 
    <module>module2</module> 
    <module>module2/test</module> 
    ... 
    <module>moduleN</module> 
    <module>moduleN/test</module> 
</modules> 

A diferencia de las convenciones de Maven, este proyecto tiene que tener sus árboles de fuentes de prueba recopilados como módulos separados, debido a las dependencias de compilación para la prueba el código difiere de las dependencias del código fuente principal. Entonces, la solución es configurar todos los módulos de prueba para que dependan de los módulos fuente principales para garantizar que se compilan en el orden correcto.

La estructura de directorios para este proyecto es muy no estándar. He colocado los pom.xml en lugares donde creo que pertenecen. Aunque no puedo cambiar esta estructura de directorios, está fuera de mi control. Es así:

/ 
+- pom.xml 
+- module1/ 
    +- pom.xml 
    +- src/ 
     +- com/ 
      +- company/ 
      +- Module1.java 
    +- test/ 
     +- pom.xml 
     +- src/ 
      +- com/ 
      +- company/ 
       +- Module1Test.java 
... 

Aquí se muestra el pom.xml para un módulo de fuente regular. Esto funciona perfectamente:

<?xml version="1.0" encoding="UTF-8"?> 
<project xmlns="http://maven.apache.org/POM/4.0.0" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 

    <modelVersion>4.0.0</modelVersion> 
    <parent> 
     <groupId>com.company</groupId> 
     <artifactId>project</artifactId> 
     <version>5.3.1-SNAPSHOT</version> 
    </parent> 

    <artifactId>module1</artifactId> 
    <packaging>jar</packaging> 

    <dependencies> 
     <dependency> 
      <groupId>com.company</groupId> 
      <artifactId>modulex</artifactId> 
      <version>${product.version}-SNAPSHOT</version> 
     </dependency> 
    </dependencies> 

    <build> 
     <finalName>${project.artifactId}</finalName> 
     <sourceDirectory>src</sourceDirectory> 

     <directory>target</directory> 
     <outputDirectory>target/classes</outputDirectory> 
     <testOutputDirectory>target/test-classes</testOutputDirectory> 

     ... 
    </build> 

</project> 

Aquí es el pom.xml para un módulo de prueba:

<?xml version="1.0" encoding="UTF-8"?> 
<project xmlns="http://maven.apache.org/POM/4.0.0" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 

    <modelVersion>4.0.0</modelVersion> 
    <parent> 
     <groupId>com.company</groupId> 
     <artifactId>project</artifactId> 
     <version>5.3.1-SNAPSHOT</version> 

     <!-- I was forced to do this because this module was 2 levels deep --> 
     <relativePath>../../pom.xml</relativePath> 
    </parent> 

    <artifactId>module1.test</artifactId> 
    <packaging>jar</packaging> 

    <dependencies> 
     <dependency> 
      <groupId>com.company</groupId> 
      <artifactId>module1</artifactId> 
      <version>${product.version}-SNAPSHOT</version> 
     </dependency> 
    </dependencies> 

    <build> 
     <finalName>${project.artifactId}</finalName> 
     <sourceDirectory>src</sourceDirectory> 
     <testSourceDirectory>src</testSourceDirectory> 

     <directory>target</directory> 
     <outputDirectory>target/classes</outputDirectory> 
     <testOutputDirectory>target/test-classes</testOutputDirectory> 

     ... 
    </build> 

</project> 

Sin embargo, ya que el módulo de prueba es un subdirectorio del módulo principal, que estoy recibiendo el siguiente errores una vez que se trata de empaquetar module.test:

[ERROR] Failed to execute goal on project module1.test: Could not resolve dependencies for project com.company:module1.test:jar:5.3.1- 
SNAPSHOT: Could not find artifact com.company:module1:jar:5.3.1-SNAPSHOT in repo1.maven.org (http://repo1.maven.org/maven2/) -> [Help 1] 

Por alguna razón, Maven piensa que necesita para traer este frasco de un repositorio, a pesar de que acaba de construir previamente ....

¿Debo mover el pom.xml en module1/test a un nivel principal como los demás? ¿Cómo puedo solucionar esto sin mover el pom.xml?

Gracias

+0

¿Por qué no puedes cambiar la estructura del directorio? Esto causará mucho dolor con Maven. Es más fácil cambiar la estructura al diseño de carpeta predeterminado de Maven. – khmarbaise

+0

¿Está seguro de que estos 2 módulos están construidos dentro del mismo reactor o 'com.company: module1: jar: 5.3.1-SNAPSHOT' está instalado en el repositorio local? –

+1

Ejecuté su instalación y no tuve problemas. Por otro lado, no sé exactamente cómo es tu padre padre. ¿Podrías publicar ese también? – maba

Respuesta

7

Lo primero es que en Maven tiene diferentes carpetas para el código de producción y el código de prueba.

src/main/java 

src/test/java 

Además, el código en src/main/java será compilada por el experto compilador-plugin y su objetivo: recopilar mientras que el código de prueba src/test/java se compilará también por el experto-compiler- plugin pero con su objetivo: testCompile.

Si tiene diferentes dependencias de prueba y producción de la misma se puede definir un ámbito de actuación y la dependencia de esta manera:

<dependency> 
    <groupId>org.testng</groupId> 
    <artifactId>testng</artifactId> 
    <version>6.2.1</version> 
    <scope>test</scope> 
    </dependency> 

que significa que este será sólo utilizable dentro de área de código de prueba y no va a ser empaquetado. Si no se define el ámbito de aplicación:

<dependency> 
    <groupId>org.testng</groupId> 
    <artifactId>testng</artifactId> 
    <version>6.2.1</version> 
    </dependency> 

Ésta es una dependencia que se utiliza para la producción y serán empaquetados si usted tiene un tipo packging como "guerra", etc.

he visto una cosa como ésta, que supongo que es un error tipográfico:

<dependencies> 
    <dependency> 
     <groupId>com.company</groupId> 
     <artifactId>modulex</artifactId> 
     <version>${product.version}-SNAPSHOT</version> 
    </dependency> 
</dependencies> 

que es simplemente errónea, porque tienes que utilizar:

<dependencies> 
     <dependency> 
      <groupId>com.company</groupId> 
      <artifactId>modulex</artifactId> 
      <version>${project.version}</version> 
     </dependency> 
    </dependencies> 

El $ {} product.version no está definido y debes usar $ {project.version} en su lugar !!

me recomiendan no saltar dos niveles dentro de un solo paso ... debe cambiar la estructura de su proyecto como este:

/ 
+- pom.xml 
+- module1/ 
    +- pom.xml 
    +-- module1-src 
     +- pom.xml 
     +- src/main/java 
      +- com/ 
       +- company/ 
       +- Module1.java 
    +-- module1-test 
     +- pom.xml 
     +- src/ 
      +- com/ 
      +- company/ 
       +- Module1Test.java 
... 

Sobre la base de la estructura anterior obtendrá cosas como:

<modules> 
    <module>module1</module> 
    <module>module2</module> 
    ... 
    <module>moduleN</module> 
</modules> 

y en el módulo 1:

<modules> 
    <module>module1-src</module> 
    <module>module1-test</module> 
</modules> 

Otherwis Empiezas a luchar contra Maven, donde perderás el combate.

Cuestiones relacionadas