我有一个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的原因(也是)。
答案 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
中,我将相同的插件(具有相同的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>