我正在为一个大型 Web 项目设置一个集成测试模块。集成测试模块与Web项目本身分离,并且有自己的pom。
想法是使用 maven-soapui-plugin 发送请求并验证响应。设置soapui插件并不麻烦。但是,我无法弄清楚如何告诉 jetty-maven-plugin 从远程存储库部署战争。
如果我理解正确的话,jetty-maven-plugin 有一个名为“
我听说我可以使用 Maven 程序集插件通过项目 artifactId 从存储库中检索战争,但我还没有弄清楚如何做到这一点。
这是我想要的摘要:
我很确定我已经完成了第 3 步,但我非常不确定如何实现第 1 步和第 2 步。
非常感谢任何帮助
也许可以使用dependency:copy
来检索战争,解压它并让整个事情与maven jetty插件一起工作,但这会很hacky并且有点难看。更干净的解决方案是使用Maven Cargo 插件,这是我的建议。下面的 POM 示例展示了如何使用坐标检索 WAR 工件以及如何使用 Cargo 将其部署到嵌入式 Jetty 容器上:
<dependencies>
<dependency>
<groupId>war group id</groupId>
<artifactId>war artifact id</artifactId>
<type>war</type>
<version>war version</version>
</dependency>
...
</dependencies>
...
<build>
<plugins>
<plugin>
<groupId>org.codehaus.cargo</groupId>
<artifactId>cargo-maven2-plugin</artifactId>
<configuration>
<!-- Container configuration -->
<container>
<containerId>jetty6x</containerId>
<type>embedded</type>
</container>
<!-- Configuration to use with the container or the deployer -->
<configuration>
<deployables>
<deployable>
<groupId>war group id</groupId>
<artifactId>war artifact id</artifactId>
<type>war</type>
<properties>
<context>war context</context>
</properties>
</deployable>
</deployables>
</configuration>
<!-- Don't wait, execute the tests after the container is started -->
<wait>false</wait>
</configuration>
<executions>
<execution>
<id>start-container</id>
<phase>pre-integration-test</phase>
<goals>
<goal>start</goal>
</goals>
</execution>
<execution>
<id>stop-container</id>
<phase>post-integration-test</phase>
<goals>
<goal>stop</goal>
</goals>
</execution>
</executions>
</plugin>
...
</plugins>
...
</build>
最后只需在
integration-test
阶段绑定soapui插件即可。
dependency:copy
阶段使用
package
,然后为
<contextHandler/>
配置
maven-jetty-plugin
列表:
<project>
…
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>copy-wars</id>
<phase>package</phase>
<goals>
<goal>copy</goal>
</goals>
<configuration>
<outputDirectory>${project.build.directory}/wars-to-be-tested</outputDirectory>
<stripVersion>true</stripVersion>
<artifactItems>
…
<artifactItem>
<groupId>groupId</groupId>
<artifactId>artifactId</artifactId>
<version>version</version>
<type>war</type>
</artifactItem>
…
</artifactItems>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.mortbay.jetty</groupId>
<artifactId>jetty-maven-plugin</artifactId>
<version>7.1.3.v20100526</version>
<configuration>
…
<contextHandlers>
…
<contextHandler implementation="org.mortbay.jetty.plugin.JettyWebAppContext">
<war>${project.build.directory}/wars-to-be-tested/artifactId.war</war>
<contextPath>/context</contextPath>
</contextHandler>
</contextHandlers>
</configuration>
<executions>
<execution>
<id>start-jetty</id>
<phase>pre-integration-test</phase>
<goals>
<goal>stop</goal>
<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>
</project>
我更愿意将各种战争声明为依赖项,然后使用
dependency:copy-dependencies
设置
wars-to-be-tested
目录;这将使 Maven 反应堆知道它需要在将要测试的战争之后构建我的集成测试模块。我遇到的问题是 Jetty 插件认为我想“覆盖”所有被列为依赖项的战争(这个概念在我看到它发生之前我从未听说过);我不知道允许这种情况发生是否会造成任何伤害,但我不喜欢它,所以我采用了
dependency:copy
方法。这只是使用 Cargo 的一种替代方法。我会自己研究这个问题,但我只是想提供另一种方法。
maven-dependency-plugin
,然后我必须修改它如下:
<plugin>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-maven-plugin</artifactId>
<version>${jetty.version}</version>
<configuration>
<supportedPackagings>jar</supportedPackagings>
<contextHandlers>
<contextHandler implementation="org.eclipse.jetty.maven.plugin.JettyWebAppContext">
<war>${project.build.directory}/wars-to-be-tested/artifactId.war</war>
</contextHandler>
</contextHandlers>
<webApp>
<contextPath>/artifactId</contextPath>
</webApp>
(这对于评论来说太大了)