Maven-Testabhängigkeit in einem Multi-Modul-Projekt

85

Ich benutze Maven, um ein Multi-Modul-Projekt zu erstellen. Mein Modul 2 hängt von Modul 1 src im Kompilierungsbereich und Modul 1-Tests im Testbereich ab.

Modul 2 -

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

Das funktioniert gut. Angenommen, mein Modul 3 hängt von Module1 src ab und wird zur Kompilierungszeit getestet.

Modul 3 -

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

Wenn ich ausgeführt werde mvn clean install, wird mein Build bis Modul 3 ausgeführt und schlägt bei Modul 3 fehl, da die Testabhängigkeit von Modul 1 nicht aufgelöst werden konnte. Dann mache ich mvn installalleine ein Modul 3, gehe zurück und laufe mvn installauf meinem übergeordneten POM, um es bauen zu lassen. Wie kann ich das beheben?

user209947
quelle
Könnten Sie uns bitte mitteilen, wie Ihr Eltern-Pom aussieht?
Chris Gummer

Antworten:

126

Ich habe Zweifel, was Sie versuchen, aber ich gehe davon aus, dass Sie die Tests, die Sie für ein Projekt (Modul 1) erstellt haben, in einem anderen wiederverwenden möchten. Wie im Hinweis am Ende des Handbuchs zur Verwendung der angehängten Tests erläutert :

Beachten Sie, dass in früheren Ausgaben dieses Handbuchs die Verwendung <classifier>tests</classifier>anstelle von empfohlen wurde <type>test-jar</type>. Während dies derzeit in einigen Fällen funktioniert, funktioniert es während eines Reaktoraufbaus des Test-JAR-Moduls und eines Verbrauchers nicht ordnungsgemäß, wenn eine Lebenszyklusphase vor der Installation aufgerufen wird. In einem solchen Szenario löst Maven die Test-JAR nicht aus der Ausgabe des Reaktor-Builds auf, sondern aus dem lokalen / Remote-Repository. Anscheinend könnte die JAR aus den Repositorys veraltet sein oder vollständig fehlen, was zu einem Build-Fehler führen könnte (vgl. MNG-2045 ).

Um kompilierte Tests in einer JAR zu verpacken und für die allgemeine Wiederverwendung bereitzustellen, konfigurieren Sie zunächst maven-jar-pluginFolgendes:

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

Installieren / implementieren Sie dann das Test-JAR-Artefakt wie gewohnt (mit mvn installoder mvn deploy).

Um die Test-JAR zu verwenden, müssen Sie eine Abhängigkeit mit einem angegebenen Typ angeben 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>
Pascal Thivent
quelle
3
Pascal. Zunächst einmal vielen Dank für die Beantwortung aller Fragen! Zu dieser Frage. Ich habe immer noch ein Problem. Ich habe eine TestBase-Klasse in einem meiner Kernmodule, die ich in allen untergeordneten Objekten verwenden möchte. Wir haben derzeit den Maven in unserem CI gebaut. Wenn ich keine Installation der Bereitstellung im Test-JAR durchführen und nur eine neue Kopie aus dem Trunk auschecken und den MVN-Test ausführen möchte. Dies schlägt fehl, da ich das Testglas noch nirgendwo habe. Irgendeine Idee, wie man damit umgeht?
Roman
@ Roman Running Install ist der "natürliche" Weg. Aber es sieht so aus, als hätten Sie eine Problemumgehung gefunden.
Pascal Thivent
Es scheint diese Ausgabe 3559 nicht 2045 zu sein, die an dieser Stelle die Verzögerung
HDave
Obwohl dies erklärt, was passiert, bietet es keine Problemumgehung. Es wird nur vorgeschlagen, das zu tun, was OP (und z. B. ich) bereits tut.
Antoniossss
19

In Bezug auf meinen Kommentar zur Pascals-Frage denke ich, dass ich eine passende Antwort gefunden habe:

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

Der Hauptunterschied hier, wie Sie hier sehen, ist das <phase>Tag.

Ich werde das Test-Jar erstellen und es wird in der Kompilierungsphase der Tests und nicht nur nach der Paketphase verfügbar sein.

Funktioniert bei mir.

römisch
quelle
1
Ja, sehr praktisch. Danke für das Teilen. Ich denke, der Bereitstellungsansatz ist nur dann besser, wenn Sie ein Unternehmensverzeichnis haben (ja, ich weiß, dass dies dringend empfohlen wird). Danke @Roman
Damien
2

Wie https://maven.apache.org/plugins/maven-jar-plugin/examples/create-test-jar.html sagt:

So erstellen Sie ein Glas mit Testklassen Wenn Sie ein Glas mit Testklassen erstellen möchten, möchten Sie diese Klassen wahrscheinlich wiederverwenden. Es gibt zwei Möglichkeiten, dies zu lösen:

  1. The easy way Erstellen Sie eine angehängte JAR mit den Testklassen aus dem aktuellen Projekt und verlieren Sie die transitiven Abhängigkeiten im Testbereich.

  2. The preferred way Erstellen Sie ein separates Projekt mit den Testklassen.

Bitte lesen Sie diesen Artikel für Details.

Doof
quelle