2011-01-24 1 views
13

Ho problemi a utilizzare le dipendenze in un progetto a più moduli. Per esempio, quando dichiaro che il modulo cleartk-syntax dipende dalla cleartk-token modulo del test-jar come questo (il codice completo è here):perché è richiesta la dipendenza da "test-jar" per "mvn compile"

<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> 

ricevo il seguente errore se corro mvn compile usando 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 

Se uso Maven 3 ottengo l'errore:

[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 

In quest'ultimo caso, io sono il par particolarmente confuso perché avrei pensato che dovrebbe essere alla ricerca di un artefatto di tipo test-jar non di tipo jar.

Con Maven 2 o Maven 3, posso farlo compilare eseguendo mvn compile package -DskipTests. Con maven 3, posso anche farlo compilare eseguendo mvn compile test-compile.

Ma perché Maven 2 o Maven 3 cercano una dipendenza test-jar durante la fase compile? Non dovrebbe aspettare fino alla fase test-compile per cercare tali dipendenze?

Aggiornamento: La risposta è stata che il plug-in maven-exec, utilizzato durante la fase di compilazione, requires dependency resolution of artifacts in scope:test. Ho creato a feature request to remove the scope:test dependency.

risposta

8

Questo mi sembra un bug preciso.

Ho lo stesso problema e ho testato Maven 3.0.1 e 3.0.2. Convalida non fallisce, solo il passo di compilazione fallisce. Con Maven 3 interruzioni mvn compile ma mvn test-compile funziona.

Sembra che la fase di compilazione stia cercando gli artefatti del vaso di prova nel reattore e quindi il repo, ma non dovrebbe poiché la dipendenza è nel campo di applicazione del test. Gli artefatti dell'ambito del test devono essere risolti durante il test-compile, non compilati.

Come risultato, ho pensato che questo potesse essere risolto mappando l'obiettivo testCompile del plugin di maven-plugin alla fase di compilazione, invece della fase di compilazione di test predefinita.

ho aggiunto questo al mio pom, proprio accanto alla parte che aggiunge la creazione di test-jar nel pom monte:

<!-- 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> 

Ma questo sistema non funziona o perché le cinque fasi tra di compilazione e di test -compile non ha eseguito e impostato cose come il classpath di prova.

Immagino che la soluzione reale fino a quando questo bug è stato risolto è quello di utilizzare test-compile al posto di compile.

+0

Ho confermato che la prima fase di Maven a funzionare è test-compile. processo-test-risorse non riesce. –

+0

Felice di sentire che non sono il solo a incappare in questo bug. Nel tuo caso stai anche usando il plugin 'exec: java' - che sembrava essere parte del problema per me. In caso contrario, stai vincolando altri plug-in alle fasi di esecuzione? – Steve

+0

Quello che ho scoperto di recente, ma che non ho ancora svolto, è che posso causare il problema con un set molto ridotto di 3 file pom. Se questi tre (il mio progetto) ereditano dal nulla, funziona. Se ereditano da org.apache: apache si rompe. Quindi uno dei plugin definiti probabilmente lo sta violando. Non c'è exec: java plugin lì - ma uno di quei plug-in e quello exec probabilmente dipendono da qualcos'altro che va a monte. Commenterò qui se riesco a ridurlo. –

0

Sto usando maven2. Immagino che la risposta sia nella gestione del ciclo di vita di Maven. Il primo passo di un ciclo di vita predefinito è valido, il che "convalida il progetto è corretto e tutte le informazioni necessarie sono disponibili". (vedi http://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html).

Quindi Maven fa del suo meglio per ottenere tutte le dipendenze necessarie per l'esecuzione successiva.

+0

Ma se questo è il caso, allora perché "mvn compile package' funziona? – Steve

+0

Hai detto che funziona solo se fornisci -DskipTests = true variable. Può essere qualcosa di ottimizzazione interna di Maven? – WeMakeSoftware

+0

Funziona anche senza -DskipTests. L'ho appena aggiunto dato che sto solo cercando di compilare, non di testare. – Steve

1

Così ho fatto un serio debugging e ho scoperto che il problema sembra essere un'interazione tra il plugin exec:java, le dipendenze test-jar e mvn compile.

In breve, se si allega exec:java a una fase di esecuzione, mvn compile inizia a cercare le dipendenze test-jar in fase di compilazione. Se si rimuove l'elemento dalla dichiarazione del plug-in exec:java, mvn compile funziona correttamente.

ho presentato un bug report per il plugin exec:java qui, anche se non posso davvero dire se il bug è in exec:java, test-jar o mvn compile quindi forse il bug verrà spostato altrove se/quando qualcuno capisce che fuori:

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

Update: non è proprio un bug, l'esperto-exec-plugin è documentato come richiedono dipendenze test:

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

Ciò non significa che non sarebbe una caratteristica eccezionale. ;-)

7

Nel mio caso, la causa principale era che il modulo che deve essere utilizzato come dipendenza nello scope test con tipo test-jar non includeva la configurazione richiesta maven-jar-plugin. Senza lo snippet riportato di seguito, nessun jar di test verrà distribuito quando si chiama mvn deploy sul rispettivo modulo.

<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> 

Vedere https://maven.apache.org/guides/mini/guide-attached-tests.html per maggiori dettagli.

+0

Questa è stata anche la mia causa principale . – riverhorse