在 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>
我有一个 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>