2009-08-14 12 views
9

Ich möchte das Maven Compiler-Plugin in einer anderen Phase und mit anderen sourceDirectories und Zielverzeichnissen, so dass Code aus anderen Verzeichnissen als src/main/java und src/test/java ausgeführt werden kann benutzt.Maven2 Compiler benutzerdefinierte Ausführung Quellverzeichnis und Zielverzeichnis

Ich dachte, die Lösung würde ungefähr so ​​aussehen wie unten, wo die Phase, zu der ich sie verlinkte, ein Vorintegrationstest war. Die Eigenschaften für testSourceDirectory und testOutputDirectory scheinen jedoch nicht auf diese Weise angegeben zu sein, da sie sich im Abschnitt des POM befinden.

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-compiler-plugin</artifactId> 

    <executions> 
    <execution> 
     <id>compile mytests</id> 
     <goals> 
     <goal>testCompile</goal> 
     </goals> 
     <phase>pre-integration-test</phase> 
     <configuration> 
     <testSourceDirectory>${basedir}/src/inttest/java</testSourceDirectory> 
     <testOutputDirectory>${basedir}/target/inttest-classes</testOutputDirectory> 
     </configuration> 
    </execution> 
    </executions> 
</plugin> 

Gibt es eine Möglichkeit, dieses Plug-in bekommen verschiedene Verzeichnisse in verschiedenen Phasen zu kompilieren, ohne den Standardbetrieb zu beeinträchtigen?

Antwort

9

Die Quellverzeichnisse werden außerhalb des Compiler-Plugins innerhalb des < Build-Elements > gesetzt, damit dies nicht funktioniert.

Sie können mit der Build-Helfer-Maven-Plugins add-source und add-test-source um zusätzliche Quellverzeichnisse für Ihre Integrationstests geben, aber das wird nicht die vorhandenen Quelle dirs entfernen.

<plugin> 
    <groupId>org.codehaus.mojo</groupId> 
    <artifactId>build-helper-maven-plugin</artifactId> 
    <version>1.3</version> 
    <executions> 
     <execution> 
     <id>add-it-source</id> 
     <phase>pre-integration-test</phase> 
     <goals> 
      <goal>add-source</goal> 
     </goals> 
     <configuration> 
      <sources> 
      <source>${basedir}/src/inttest/java</source> 
      </sources> 
     </configuration> 
     </execution> 
    </executions> 
    </plugin> 

Wenn Sie das Add-Test-Quelle Ziel binden zu laufen kurz vor dem testCompile Ziel, Ihre Integrationstests einbezogen werden. Beachten Sie, dass sie in Target/Test-Klassen ausgegeben werden sollen, damit das Surefire-Plugin sie findet.

Um die Standard-Testquellen zu entfernen, schrieb ich ein kleines Plugin, um das Modell zu modifizieren, um vorhandene testSource-Speicherorte zu entfernen, bevor die für Integrationstests hinzugefügt wurden.

4

Nach mehr Forschung ist es offensichtlich, dass dies in Maven 2 tatsächlich nicht möglich ist, wie ich will, ein Hack von irgendeiner Form ist notwendig, um Integrationstests einzuführen. Während Sie weitere Verzeichnisse hinzufügen können (wie von Rich Seller vorgeschlagen) gibt es kein Plugin, um die anderen Quellen zu entfernen oder ein Verzeichnis separat von der Hauptkompilierung zu kompilieren.

Die beste Lösung, die ich gefunden habe, um Integrationstests hinzuzufügen, besteht darin, zuerst das Build-Helfer-Plugin zu verwenden, um das Verzeichnis inttest-Verzeichnis hinzuzufügen, das als Tests kompiliert werden soll.

<plugin> 
    <groupId>org.codehaus.mojo</groupId> 
    <artifactId>build-helper-maven-plugin</artifactId> 
    <executions> 
     <execution> 
      <id>add-test-source</id> 
      <phase>generate-sources</phase> 
      <goals> 
       <goal>add-test-source</goal> 
      </goals> 
      <configuration> 
       <sources> 
        <source>src/inttest/java</source> 
       </sources> 
      </configuration> 
     </execution> 
    </executions> 
</plugin> 

Um nun die Integrationstests zu erhalten über die Integration Testphase Sie umfasst nicht müssen ausführen bedienen und enthält zu manipulieren, wenn sie, wie unten laufen lassen. Dies erlaubt beliebige benutzerdefinierte Parameter (in meinem Fall wird ein Agent über Argline hinzugefügt).

<plugin> 
<groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-surefire-plugin</artifactId> 
    <configuration> 
    <excludes> 
     <exclude>**/itest/**</exclude> 
    </excludes> 
    </configuration> 
<executions> 
    <execution> 
     <id>inttests</id> 
     <goals> 
      <goal>test</goal> 
     </goals> 
     <phase>integration-test</phase> 
     <configuration> 
      <excludes><exclude>none</exclude></excludes> 
      <includes> 
       <include>**/itest/**/*Test.java</include> 
      </includes> 
     </configuration> 
    </execution> 
</executions> 
</plugin> 
+0

Leider funktioniert das auch nicht richtig. In scheint, dass, wenn Sie diese cobertura: Cobertura Integration-Test dann Maven führt die Unit-Tests mit Abdeckung, dann die Tests selbst und dann schließlich die Integration Tests und aus irgendeinem Grund ignoriert die schließt, sondern berücksichtigt die umfasst. –

Verwandte Themen