Maven verifica la dipendenza nel progetto multi modulo


86

Uso Maven per costruire un progetto multi modulo. Il mio modulo 2 dipende dal modulo 1 src nell'ambito della compilazione e dai test del modulo 1 nell'ambito del test.

Modulo 2 -

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

Funziona bene. Supponiamo che il mio modulo 3 dipenda da Module1 src e dai test in fase di compilazione.

Modulo 3 -

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

Quando eseguo mvn clean install, la mia build viene eseguita fino al modulo 3, fallisce nel modulo 3 poiché non è in grado di risolvere la dipendenza del test del modulo 1. Poi faccio da solo un mvn installmodulo 3, torno indietro e corro mvn installsul mio genitore pom per farlo costruire. Come posso risolvere questo problema?


Potresti per favore condividere come appare il tuo genitore Pom?
Chris Gummer

Risposte:


128

Ho un dubbio su quello che stai cercando di fare, ma presumo che tu voglia riutilizzare i test che hai creato per un progetto (modulo1) in un altro. Come spiegato nella nota in fondo alla Guida all'utilizzo dei test allegati :

Tieni presente che le precedenti edizioni di questa guida suggerivano di utilizzare al <classifier>tests</classifier>posto di <type>test-jar</type>. Sebbene attualmente funzioni per alcuni casi, non funziona correttamente durante la costruzione di un reattore del modulo JAR di prova e di qualsiasi consumatore se viene richiamata una fase del ciclo di vita prima dell'installazione. In tale scenario, Maven non risolverà il JAR di prova dall'output della build del reattore ma dal repository locale / remoto. Apparentemente, il JAR dai repository potrebbe essere obsoleto o completamente mancante, causando un errore di compilazione (cfr. MNG-2045 ).

Quindi, in primo luogo, per impacchettare i test compilati in un JAR e distribuirli per il riutilizzo generale, configurare maven-jar-plugincome segue:

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

Quindi, installa / distribuisci l'artefatto JAR di prova come al solito (usando mvn installo mvn deploy).

Infine, per utilizzare il JAR di prova, è necessario specificare una dipendenza con un tipo specificato di 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. Prima di tutto grazie mille per aver risposto a tutte le domande esperte !! Per quanto riguarda questa domanda. Ho ancora un problema. Ho una classe testBase in uno dei miei moduli principali che voglio utilizzare in tutti gli oggetti figlio. Attualmente abbiamo la build Maven nel nostro CI. Se non voglio fare alcuna installazione di deploy nel test-jar e solo per controllare una nuova copia dal trunk ed eseguire il test mvn. Questo fallisce, poiché non ho ancora il file di prova da nessuna parte. Qualche idea su come affrontarlo?
Roman

@Roman L'installazione in esecuzione è il modo "naturale". Ma sembra che tu abbia trovato una soluzione alternativa.
Pascal Thivent

Sembra essere questo problema 3559 non 2045 che è il problema a questo punto: jira.codehaus.org/browse/MNG-3559
HDave

Anche se questo spiega cosa sta succedendo, non fornisce soluzioni alternative. Suggerisce solo di fare ciò che OP (e ad esempio I) sta già facendo.
Antoniossss

19

Per quanto riguarda il mio commento alla domanda di Pascal, penso di aver trovato una risposta adeguata:

<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 differenza principale qui, come vedi qui, è il <phase>tag.

Creerò il test-jar e sarà disponibile in fase di compilazione dei test e non solo dopo la fase di package.

Per me va bene.


1
Sì, molto conveniente. Grazie per la condivisione. Immagino che l'approccio di distribuzione sia migliore solo quando si dispone di una directory aziendale (sì, lo so che è fortemente consigliato). Grazie @Roman
Damien

2

Come https://maven.apache.org/plugins/maven-jar-plugin/examples/create-test-jar.html dice:

Come creare un jar contenente classi di test Quando si desidera creare un jar contenente classi di test, probabilmente si vorrà riutilizzare quelle classi. Ci sono due modi per risolvere questo problema:

  1. The easy way Crea un jar allegato con le classi di test dal progetto corrente e perdi le sue dipendenze transitive nell'ambito del test.

  2. The preferred way Crea un progetto separato con le classi di test.

Si prega di leggere l'articolo per i dettagli.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.