我正在为大小合适的Web项目设置集成测试模块。集成测试模块与Web项目本身是分开的,它有自己的pom。
我们的想法是使用maven-soapui-plugin发送请求并验证响应。设置soapui-plugin并不麻烦。但是,我无法弄清楚如何告诉jetty-maven-plugin从远程存储库部署战争。
如果我理解正确,jetty-maven-plugin有一个名为'< webApp> /< webApp>'的属性这让我指定要部署的war文件。问题是war文件不存在于模块本身中。
我听说我可以使用maven程序集插件通过项目artifactId从存储库中检索战争,但我还没弄清楚我将如何去做。
以下是我想要的摘要:
我很确定我已经完成了第3步,但我不确定如何实现第1步和第2步。
非常感谢任何帮助
答案 0 :(得分:6)
可能可以使用dependency:copy
来检索战争,解压缩它并让整个事情与maven jetty插件一起工作,但这会很丑陋而且有点难看。更清洁的解决方案是使用Maven Cargo plugin,这是我的建议。下面是一个示例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插件。
答案 1 :(得分:4)
我做同样的事情,约翰,但我采用了不同的Jetty插件方法。我认为最终结果是一样的。我正在开发一个集成测试套件来运行几个Web服务WAR。我在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的替代方案。我会自己调查,但我只想提供另一种方法。