具有多模块和战争叠加的tomcat-maven-plugin

时间:2013-04-09 13:51:05

标签: maven war maven-tomcat-plugin

我有一个maven war项目(称之为 projectA )依赖于另一个maven战争(称之为 projectB )。它们使用maven-war-plugin的叠加层进行集成。两个项目都具有相同的父级和相同的聚合器(与父级不同)。我可以毫无问题地成功打包最后的战争。这是我正在运行的命令(运行mvn时我处于聚合器级别):

mvn -am -pl projectA package

反应堆构建订单是父级 projectB projectA ,一切正常。

我现在正尝试在此版本中使用tomcat-maven-plugin。所以我在父pom tomcat-maven-plugin部分添加了pluginManagement,并在 projectA pom中使用了它。我正在启动tomcat:

mvn -am -pl projectA tomcat:run

反应堆构建顺序保持不变。但是tomcat执行是在 projectB (这也是一场战争)和 projectA 上的不是上运行的。实际上,甚至没有达到 projectA 构建。

我尝试过使用org.codehaus.mojo.tomcat-maven-plugin v1.1和org.apache.tomcat.maven.tomcat6-maven-plugin v2.1,我发现了同样的行为。

如何让tomcat运行最终的 projectA

注意:项目依赖项实际上有点复杂,还有其他子项目涉及(jars),这就是我用-am调用maven的原因(也是)。

1 个答案:

答案 0 :(得分:1)

好的,所以我找到了解决方案。要禁用 pojectB maven-tomcat-plugin,此答案基于this other question

将插件链接到特定阶段

首先我必须将maven-tomcat-plugin链接到我的构建周期的一个阶段,以便即使我不直接从CLI调用插件也会调用它,显然我选择了integration-test相。我现在可以运行mvn integration-test -pl projectA来使用刚刚构建的战争启动tomcat。

这是插件在中声明的方式:

<pluginManagement>
<plugins>
<plugin>
    <groupId>org.apache.tomcat.maven</groupId>
    <artifactId>tomcat6-maven-plugin</artifactId>
    <version>2.1</version>
    <executions>
       <execution>
           <id>run-war</id>
           <!-- We link this plugin to some non default phase so that we can disable it in some modules. -->
           <phase>integration-test</phase>
           <goals>
               <goal>run-war</goal>
           </goals>
       </execution>
    </executions>
</plugin>
</plugins>
</pluginManagement>

并在 projectA 中,我只是按照中声明的方式使用它:

<build>
<plugins>
<plugin>
    <groupId>org.apache.tomcat.maven</groupId>
    <artifactId>tomcat6-maven-plugin</artifactId>
</plugin>
</plugin>
</build>

取消激活projectB中的插件

然后,在projectB中,我将相同的插件(具有相同的id)链接到null / void / empty阶段,最终在为此项目构建时禁用此项目的插件{ {1}}阶段:

integration-test

通过该设置,我现在可以完成一个完整的构建(projectB,projectA和其他依赖项)并在一次运行中启动tomcat并产生战争:

<build>
<plugins>
<plugin>
    <groupId>org.apache.tomcat.maven</groupId>
    <artifactId>tomcat6-maven-plugin</artifactId>
    <executions>
        <execution>
            <id>run-war</id>
            <!-- We don't want this plugin to be called from another module build -->
            <phase/>
        </execution>
    </executions>
</plugin>
</plugins>
</build>