如何使jetty-maven-plugin部署从存储库中检索的战争?

时间:2010-04-20 18:56:44

标签: maven-2 soapui pom.xml maven-assembly-plugin maven-jetty-plugin

我正在为大小合适的Web项目设置集成测试模块。集成测试模块与Web项目本身是分开的,它有自己的pom。

我们的想法是使用maven-soapui-plugin发送请求并验证响应。设置soapui-plugin并不麻烦。但是,我无法弄清楚如何告诉jetty-maven-plugin从远程存储库部署战争。

如果我理解正确,jetty-maven-plugin有一个名为'< webApp> /< webApp>'的属性这让我指定要部署的war文件。问题是war文件不存在于模块本身中。

我听说我可以使用maven程序集插件通过项目artifactId从存储库中检索战争,但我还没弄清楚我将如何去做。

以下是我想要的摘要:

  1. 从存储库等中检索特定的战争,例如通过其artifactId。
  2. 将此战争部署到jetty-maven-plugin(目标部署 - 战争?)
  3. 获取maven-soapui-plugin以运行测试并在集成测试阶段报告结果。
  4. 我很确定我已经完成了第3步,但我不确定如何实现第1步和第2步。

    非常感谢任何帮助

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的替代方案。我会自己调查,但我只想提供另一种方法。