2011-01-24 17 views
13

Tengo problemas para utilizar las dependencias test-jar en un proyecto de varios módulos. Por ejemplo, cuando declaro que el módulo cleartk-syntax depende de la cleartk-token módulo de test-jar como esto (el código completo es here):por qué es necesaria la dependencia "jar-prueba" para "compilación mvn"

<modelVersion>4.0.0</modelVersion> 
<groupId>org.cleartk</groupId> 
<artifactId>cleartk-syntax</artifactId> 
<version>0.5.0-SNAPSHOT</version> 
<name>cleartk-syntax</name> 
... 
<dependencies> 
    ... 
    <dependency> 
     <groupId>org.cleartk</groupId> 
     <artifactId>cleartk-token</artifactId> 
     <version>0.7.0-SNAPSHOT</version> 
     <type>test-jar</type> 
     <scope>test</scope> 
    </dependency> 

me sale el siguiente error si corro mvn compile utilizando Maven 2:

[INFO] ------------------------------------------------------------------------ 
[ERROR] BUILD ERROR 
[INFO] ------------------------------------------------------------------------ 
[INFO] Failed to resolve artifact. 

Missing: 
---------- 
1) org.cleartk:cleartk-token:test-jar:tests:0.7.0-SNAPSHOT 

Si uso experto 3 me sale el error:

[INFO] ------------------------------------------------------------------------ 
[INFO] BUILD FAILURE 
[INFO] ------------------------------------------------------------------------ 
[INFO] Total time: 4.654s 
[INFO] Finished at: Mon Jan 24 21:19:17 CET 2011 
[INFO] Final Memory: 16M/81M 
[INFO] ------------------------------------------------------------------------ 
[ERROR] Failed to execute goal on project cleartk-syntax: Could not resolve 
dependencies for project org.cleartk:cleartk-syntax:jar:0.5.0-SNAPSHOT: Could 
not find artifact org.cleartk:cleartk-token:jar:tests:0.7.0-SNAPSHOT 

En este último caso, soy la par particularmente confundido porque habría pensado que debería estar buscando un artefacto del tipo test-jar que no sea del tipo jar.

Con maven 2 o maven 3, puedo hacer que compile ejecutando mvn compile package -DskipTests. Con maven 3, también puedo hacer que compile ejecutando mvn compile test-compile.

¿Pero por qué maven 2 o maven 3 buscan una dependencia test-jar durante la fase compile? ¿No debería esperar hasta la fase test-compile para buscar tales dependencias?

Actualización: La respuesta fue que maven-exec-plugin, utilizado durante mi fase de compilación, requires dependency resolution of artifacts in scope:test. Creé a feature request to remove the scope:test dependency.

Respuesta

8

Esto parece un error definitivo para mí.

Tengo el mismo problema y he probado Maven 3.0.1 y 3.0.2. Validar no falla, solo falla el paso de compilación. Con Maven 3 mvn compile se rompe pero funciona mvn test-compile.

Parece que la fase de compilación está buscando artefactos de prueba en el reactor y luego repos, pero no debería hacerlo ya que la dependencia está en el alcance de la prueba. Los artefactos del alcance de la prueba se deben resolver durante la compilación de prueba, no compilar.

Como resultado, pensé que esto podría solucionarse asignando el objetivo testCompile de maven-compiler-plugin a la fase de compilación, en lugar de la fase de compilación de prueba predeterminada.

he añadido esto a mi pom, justo al lado de la parte que se suma la creación de pruebas-jar en el pom aguas arriba:

<!-- there is a bug in maven causing it to resolve test-jar types 
     at compile time rather than test-compile. Move the compilation 
     of the test classes earlier in the build cycle --> 
    <plugin> 
    <artifactId>maven-compiler-plugin</artifactId> 
    <executions> 
     <execution> 
     <id>default-testCompile</id> 
     <phase>compile</phase> 
     <goals> 
      <goal>testCompile</goal> 
     </goals> 
     </execution> 
    </execution> 
    </plugin> 

Pero eso no va a funcionar bien porque las cinco fases entre compilación y prueba -compile no ha ejecutado y configurado cosas como el classpath de prueba.

Supongo que la solución real hasta que se solucione este error es usar test-compile en lugar de compile.

+0

He confirmado que la primera fase de maven para trabajar es compilación de prueba. proceso-prueba-recursos falla. –

+0

Me alegra oír que no estoy solo al encontrarme con este error. En tu caso, también estás usando el complemento 'exec: java', que parecía ser parte del problema para mí. Si no, ¿está vinculando otros complementos a las fases de ejecución? – Steve

+0

Lo que he descubierto recientemente, pero aún no he desenrollado, es que puedo causar el problema con un conjunto muy reducido de 3 archivos pom. Si estos tres (mi proyecto) heredan de la nada, funciona. Si heredan de org.apache: apache se rompe. Entonces, uno de los complementos definidos allí probablemente lo está rompiendo. No hay ningún ejecutor: el complemento java existe, pero uno de esos complementos y el ejecutivo probablemente dependan de algo más que se haya roto antes. Voy a comentar aquí si puedo reducirlo. –

0

Estoy usando maven2. Supongo que la respuesta está en la gestión del ciclo de vida maven. El primer paso de un ciclo de vida predeterminado es validar, lo que significa 'validar que el proyecto sea correcto y que toda la información necesaria esté disponible'. (ver http://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html).

Así que maven hace todo lo posible para obtener todas las dependencias necesarias para la ejecución posterior.

+0

Pero si ese es el caso, ¿por qué funciona 'mvn compile package'? – Steve

+0

Ha mencionado que solo funciona si proporciona -DskipTests = true variable. ¿Puede ser eso una optimización interna de maven? – WeMakeSoftware

+0

Funciona sin -DskipTests también. Acabo de agregar eso ya que solo estoy tratando de compilar, no de probar. – Steve

1

Así que hice una depuración seria, y descubrí que el problema parece ser una interacción entre el exec:java plugin, test-jar dependencias y mvn compile.

En resumen, si conecta exec:java a una fase de ejecución, mvn compile comienza a buscar dependencias test-jar en tiempo de compilación. Si elimina el elemento <executions> de la declaración del complemento exec:java, mvn compile funciona bien de nuevo.

me presentó un informe de error para el plug-in exec:java aquí, aunque en realidad no puedo decir si el fallo está en exec:java, test-jar o mvn compile así que quizás el error será movido a otro sitio si/cuando alguien imagina que fuera:

http://jira.codehaus.org/browse/MEXEC-91

actualización: en realidad no es un error, el experto-exec-plugin está documentado como dependencias de prueba que requieren aquí:

http://mojo.codehaus.org/exec-maven-plugin/java-mojo.html

Eso no significa que no sea una gran característica. ;-)

7

En mi caso la causa fue que el módulo que debe ser utilizado como una dependencia en test alcance con el tipo test-jar no incluye la configuración requerida maven-jar-plugin. Sin el fragmento a continuación, no se desplegará ningún tarro de prueba cuando llame al mvn deploy en el módulo respectivo.

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

Ver https://maven.apache.org/guides/mini/guide-attached-tests.html para más detalles.

+0

Esa fue mi causa raíz, también . – riverhorse

Cuestiones relacionadas