Search code examples
mavenmaven-3maven-jetty-pluginmaven-deploy-plugin

Integration testing Maven jar in a Jetty container


I have a Maven project which produces a jar file that is meant to be used in a web service. It has integration tests which use the jetty-maven-plugin to run.

In order to run the integration tests on the compiled jar file, I've had to create a dependency with <systemPath>${project.build.directory}/${project.build.finalName}.${project.packaging}</systemPath>. The integration tests run as I had hoped, using the compiled jar file and correctly creating the web-app out of the src/test directory.

So in terms of this projects build, this setup works very well.

The problem is that the POM file, which is deployed during the release process, still has the systemPath dependency. This means that projects which use the jar are reporting an error during the build. The error says that the jar file "must specify an absolute path". These builds don't fail, but the logs are cluttered and misleading.

I'm looking to remove this systemPath from the POM which is deployed to our Maven repository. How can we do this?

For reference, here is the relevant portion of the project's 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>

Solution

  • Jetty's documentation regarding <classesDirectory> reads:

    Location of your compiled classes for the webapp. [...]

    So, this should be ${project.build.testOutputDirectory} rather than ${project.build.testSourceDirectory}, shouldn't it?

    <useTestClasspath> isn't mentioned in Jetty's doc.

    Is it possible to install the dependency and use <scope>provided? Since with that:

    [the dependency] is only available on the compilation and test classpath, and is not transitive.