it-swarm.com.de

Maven-Testabhängigkeit in Multi-Modul-Projekten

Ich benutze Maven, um ein Multi-Modul-Projekt zu erstellen. Mein Modul 2 ist abhängig von Modul 1 src im Kompilierungsumfang und Modul 1 testet im Testumfang.

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 Modul1 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 mvn clean install, mein Build läuft bis Modul 3, schlägt bei Modul 3 fehl, da die Testabhängigkeit von Modul 1 nicht aufgelöst werden konnte. Dann mache ich ein mvn install auf Modul 3 alleine, gehe zurück und starte mvn install auf meinem Elternteil pom, um es bauen zu lassen. Wie kann ich das beheben?

79
user209947

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

Beachten Sie, dass in früheren Ausgaben dieses Handbuchs die Verwendung von <classifier>tests</classifier> Anstelle von <type>test-jar</type> Empfohlen wurde. Während dies derzeit in einigen Fällen funktioniert, funktioniert es während eines Reaktorbaus des Test-JAR-Moduls und aller Verbraucher 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/fernen Repository. Anscheinend könnte die JAR aus den Repositorys veraltet sein oder vollständig fehlen und einen Build-Fehler verursachen (vgl. MNG-2045 ).

Um kompilierte Tests in eine JAR zu packen und für die allgemeine Wiederverwendung bereitzustellen, konfigurieren Sie zunächst maven-jar-plugin Wie folgt:

<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 Sie anschließend das Test-JAR-Artefakt wie gewohnt (mit mvn install Oder mvn deploy).

Um die Test-JAR zu verwenden, müssen Sie eine Abhängigkeit mit dem angegebenen Typ test-jar Angeben:

<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>
116
Pascal Thivent

In Bezug auf meinen Kommentar zu 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 der <phase> Etikett.

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

Funktioniert bei mir.

17
Roman

As https://maven.Apache.org/plugins/maven-jar-plugin/examples/create-test-jar.html sagt:

So erstellen Sie eine JAR-Datei mit Testklassen Wenn Sie eine JAR-Datei 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-Datei mit den Testklassen aus dem aktuellen Projekt, und verlieren Sie die Abhängigkeiten für den transitiven Testbereich.

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

Bitte lesen Sie diesen Artikel für Details.

2
Goofy