2016-04-07 8 views
1

Ich habe ein Maven-Projekt, das eine JAR-Datei erzeugt, die in einem Webdienst verwendet werden soll. Es hat Integrationstests, die das jetty-maven-plugin verwenden, um zu laufen.Integrationsprüfung Maven-Gefäß in einem Jetty-Container

Um die Integrationstests für die kompilierte JAR-Datei auszuführen, musste ich eine Abhängigkeit mit <systemPath>${project.build.directory}/${project.build.finalName}.${project.packaging}</systemPath> erstellen. Die Integrationstests laufen so, wie ich es mir erhofft hatte, mit der kompilierten JAR-Datei und dem korrekten Erstellen der Web-App aus dem Verzeichnis src/test.

Also in Bezug auf diese Projekte bauen, funktioniert diese Einrichtung sehr gut.

Das Problem besteht darin, dass die POM-Datei, die während des Freigabevorgangs bereitgestellt wird, immer noch die systemPath-Abhängigkeit hat. Dies bedeutet, dass Projekte, die der Jar verwenden, einen Fehler während des Builds melden. Der Fehler besagt, dass die JAR-Datei "einen absoluten Pfad angeben muss". Diese Builds schlagen nicht fehl, aber die Logs sind unübersichtlich und irreführend.

Ich suche diese systemPath aus dem POM zu entfernen, die in unserem Maven-Repository bereitgestellt wird. Wie können wir das tun?

Als Referenz ist hier der relevante Teil des Projekts POM.

<build> 
    <plugins> 
    <plugin> 
     <groupId>org.eclipse.jetty</groupId> 
     <artifactId>jetty-maven-plugin</artifactId> 
     <version>9.0.7.v20131107</version> 
     <configuration> 
     <webAppSourceDirectory>${project.basedir}/src/test/webapp</webAppSourceDirectory> 
     <classesDirectory>${project.build.testSourceDirectory}</classesDirectory> 
     <useTestClasspath>true</useTestClasspath> 
     </configuration> 
     <dependencies> 
     <dependency> 
      <groupId>${project.groupId}</groupId> 
      <artifactId>${project.artifactId}</artifactId> 
      <version>${project.version}</version> 
      <scope>system</scope> 
      <systemPath>${project.build.directory}/${project.build.finalName}.${project.packaging}</systemPath> 
     </dependency> 
     </dependencies> 
     <executions> 
     <execution> 
      <id>start-jetty</id> 
      <phase>pre-integration-test</phase> 
      <goals> 
      <goal>run</goal> 
      </goals> 
      <configuration> 
      <scanIntervalSeconds>0</scanIntervalSeconds> 
      <daemon>true</daemon> 
      </configuration> 
     </execution> 
     <execution> 
      <id>stop-jetty</id> 
      <phase>post-integration-test</phase> 
      <goals> 
      <goal>stop</goal> 
      </goals> 
     </execution> 
     </executions> 
    </plugin> 
    </plugins> 
</build> 

Antwort

1

Jetty's documentation bezüglich <classesDirectory> lautet:

Lage der kompilierten Klassen für die Webapp. [...]

So sollte diese ${project.build.testOutputDirectory} anstatt ${project.build.testSourceDirectory}, sollte es nicht?

<useTestClasspath> wird in Jetty's doc nicht erwähnt.

Ist es möglich, install die Abhängigkeit und <scope>provided zu verwenden? Seit dem:

[die Abhängigkeit] ist nur für den Kompilierungs- und Testklassenpfad verfügbar und nicht transitiv.

+0

Vielen Dank für die Antwort. Der Integrationstest läuft als Teil der Maven 'verify'-Phase, die vor der 'install'-Phase im Lebenszyklus abläuft. Also das würde nicht funktionieren für die Verwendung von zur Verfügung gestellt, oder? –

+0

@DavidV Das stimmt, aber Sie könnten das [maven-install-plugin] (https://maven.apache.org/plugins/maven-install-plugin/) an eine frühere Phase, 'pre-integration-test' binden zum Beispiel. –

+0

Ich habe zu '$ {project.build.testOutputDirector}}' gewechselt und ' Laufzeit' verwendet. Dann konnte ich den 'systemPath' entfernen und alles funktioniert gut. –

0

Die Lösung war eine geringfügige Modifikation von Gerold Broser's answer.

Hier sind die entsprechenden Abschnitte:

<plugin> 
    <groupId>org.eclipse.jetty</groupId> 
    <artifactId>jetty-maven-plugin</artifactId> 
    <version>9.1.5.v20140505</version> 
    <configuration> 
     <webAppSourceDirectory>${project.basedir}/src/test/webapp</webAppSourceDirectory> 
     <classesDirectory>${project.build.testOutputDirectory}</classesDirectory> 
    </configuration> 
    <dependencies> 
     <dependency> 
      <groupId>${project.groupId}</groupId> 
      <artifactId>${project.artifactId}</artifactId> 
      <version>${project.version}</version> 
      <scope>runtime</scope> 
     </dependency> 
    </dependencies> 
</plugin> 
Verwandte Themen