在 Jetty 容器中集成测试 Maven jar

Integration testing Maven jar in a Jetty container

我有一个 Maven 项目,它生成一个用于 Web 服务的 jar 文件。它有使用 jetty-maven-plugin 到 运行.

的集成测试

为了 运行 对已编译的 jar 文件进行集成测试,我不得不使用 <systemPath>${project.build.directory}/${project.build.finalName}.${project.packaging}</systemPath> 创建一个依赖项。正如我所希望的那样,集成测试 运行,使用编译的 jar 文件并从 src/test 目录中正确创建 Web 应用程序。

因此,就此项目构建而言,此设置非常有效。

问题是在发布过程中部署的 POM 文件仍然具有 systemPath 依赖性。这意味着 使用 jar 的项目在构建期间报告错误。该错误表明 jar 文件 "must specify an absolute path"。这些构建不会失败,但日志杂乱无章且具有误导性。

我想从部署到我们的 Maven 存储库的 POM 中删除这个 systemPath。我们该怎么做?

作为参考,这里是项目 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>

Jetty's documentation 关于 <classesDirectory> 读作:

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

所以,这应该是 ${project.build.testOutputDirectory} 而不是 ${project.build.testSourceDirectory},不是吗?

<useTestClasspath> 未在 Jetty's doc 中提及。

是否可以 install 依赖并使用 <scope>provided?从那以后:

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

解决方案是对 的轻微修改。

以下是相关部分:

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