2009-11-12 23 views
69

Uso maven para crear un proyecto de varios módulos. Mi módulo 2 depende del módulo 1 src en el ámbito de compilación y del módulo 1 en el alcance de la prueba.Dependencia de prueba de Maven en proyecto de varios módulos

Módulo 2 -

<dependency> 
     <groupId>blah</groupId> 
     <artifactId>MODULE1</artifactId> 
     <version>blah</version> 
     <classifier>tests</classifier> 
     <scope>test</scope> 
    </dependency> 

Esto funciona bien. Supongamos que mi módulo 3 depende de Module1 src y las pruebas en tiempo de compilación.

Módulo 3 -

<dependency> 
     <groupId>blah</groupId> 
     <artifactId>MODULE1</artifactId> 
     <version>blah</version> 
     <classifier>tests</classifier> 
     <scope>compile</scope> 
    </dependency> 

Cuando corro mvn clean install, mi construcción se imparte hasta el módulo 3, falla en el módulo 3, ya que no podía resolver la dependencia de prueba del módulo 1. Luego hago un mvn install en el módulo 3 solo, vuelvo y ejecuto mvn install en mi pom padre para hacerlo construir. ¿Cómo puedo arreglar esto?

+0

¿Podría compartir el aspecto de su pom padre? –

Respuesta

104

Tengo una duda acerca de lo que intenta hacer, pero supongo que quiere volver a utilizar las pruebas que ha creado para un proyecto (module1) en otro. Como se explica en la nota al pie de la Guide to using attached tests:

Tenga en cuenta que las ediciones anteriores de esta guía sugiere utilizar <classifier>tests</classifier> en lugar de <type>test-jar</type>. Si bien esto actualmente funciona en algunos casos, no funciona correctamente durante una construcción del reactor del módulo JAR de prueba y cualquier consumidor si se invoca una fase del ciclo de vida antes de la instalación. En tal escenario, Maven no resolverá el JAR de prueba a partir de la salida de la construcción del reactor, sino desde el repositorio local/remoto. Aparentemente, el JAR de los repositorios podría estar desactualizado o faltar por completo, causando una falla de compilación (consulte MNG-2045).

Así, en primer lugar, a empaquetar las pruebas recopiladas en un frasco y desplegarlos para su reutilización en general, configure la maven-jar-plugin de la siguiente manera:

<project> 
    <build> 
    <plugins> 
    <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-jar-plugin</artifactId> 
     <version>2.2</version> 
     <executions> 
     <execution> 
      <goals> 
      <goal>test-jar</goal> 
      </goals> 
     </execution> 
     </executions> 
    </plugin> 
    </plugins> 
    </build> 
</project> 

A continuación, instale/desplegar el artefacto jarra de prueba como de costumbre (usando mvn install o mvn deploy).

Por último, para usar la jarra de prueba, se debe especificar una dependencia con un tipo determinado de test-jar:

<project> 
    ... 
    <dependencies> 
    <dependency> 
     <groupId>com.myco.app</groupId> 
     <artifactId>foo</artifactId> 
     <version>1.0-SNAPSHOT</version> 
     <type>test-jar</type> 
     <scope>test</scope> 
    </dependency> 
    </dependencies> 
    ... 
</project> 
+3

Pascal. En primer lugar, ¡muchas gracias por responder a todas las preguntas de maven! Con respecto a esta pregunta. Todavía tengo un problema Tengo una clase testBase en uno de mis módulos principales que quiero usar en todos los objetos secundarios. Actualmente tenemos la estructura Maven en nuestro CI.Si no quiero hacer ninguna instalación de implementación en el archivo de prueba y solo para verificar una nueva copia desde el enlace troncal y ejecutar la prueba mvn. Esto falla, ya que todavía no tengo el jarrón de prueba en ninguna parte. ¿Alguna idea de cómo lidiar con eso? – Roman

+0

@Roman La instalación en ejecución es la forma "natural". Pero parece que encontraste una solución. –

+0

Parece ser que este problema 3559 no 2045 es el límite en este punto: http://jira.codehaus.org/browse/MNG-3559 – HDave

15

En cuanto a mi comentario a Pascales pregunta creo que he encontrado una respuesta stuitable:

<plugins> 
    <plugin> 
     <artifactId>maven-jar-plugin</artifactId> 
     <version>2.2</version> 
     <executions> 
      <execution> 
      <goals> 
       <goal>test-jar</goal> 
      </goals> 
      <phase>test-compile</phase> 
     </execution> 
     </executions> 
     <configuration> 
      <outputDirectory>${basedir}\target</outputDirectory> 
     </configuration> 
    </plugin> 
</plugins> 

La principal diferencia aquí, como puede ver aquí, es la etiqueta <phase>.

Crearé el archivo de prueba y estará disponible en la fase de compilación de las pruebas y no solo después de la fase del paquete.

Funciona para mí.

+1

Gracias por la sugerencia @Roman esto ha sido muy útil. –

+1

Sí, muy conveniente. Gracias por compartir. Supongo que el enfoque de implementación es mejor solo cuando tienes un directorio corporativo (sí, sé que esto es muy recomendable). Gracias @Roman – Damien

Cuestiones relacionadas