如何让Maven运行战争:爆炸但不是战争:战争

我有一个使用<packaging>war</packaging>的Maven pom。 但实际上,我不想构buildwar文件,只想收集所有依赖的jar文件,并创build一个完整的部署目录。

所以我正在运行war:exploded目标,以生成部署目录:

 <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-war-plugin</artifactId> <executions> <execution> <phase>package</phase> <configuration> <webappDirectory>target/${env}/deploy</webappDirectory> <archiveClasses>true</archiveClasses> </configuration> <goals> <goal>exploded</goal> </goals> </execution> </executions> </plugin> 

麻烦的是,战争档案还在build立中。 有没有一个简单的方法让<packaging>war</packaging>执行war:exploded目标,而不是战争:战争的目标?

还是有另一种简单的方法来做到这一点?

根据包装阶段战争中的战争包装的内置生命周期绑定 :战争魔咒被称为。

你可以打电话给以前的“准备包装”阶段 – 所有的行动将被执行,并在那之后召唤魔战:爆炸

 mvn prepare-package war:exploded 

结果将与你的一样,但没有创build战争。

解决scheme非常简单。 您需要覆盖war插件的默认执行来禁用它,并添加您自己的执行(用于展开):

 <pluginManagement> <plugins> <plugin><!-- don't pack the war --> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-war-plugin</artifactId> <executions> <execution> <id>default-war</id> <phase>none</phase> </execution> <execution> <id>war-exploded</id> <phase>package</phase> <goals> <goal>exploded</goal> </goals> </execution> </executions> </plugin> </plugins> </pluginManagement> 

我所能想到的做的唯一方法就是设置使用pom包装(或者创build自定义包装 ),并将战争包装所需的目标绑定到生命周期的相关阶段。 如果你去POM包装你可以使用定义战争:configuration文件中的战争执行允许你打包它,但是你需要使用build-helper-maven-plugin attach-artifact的目标来把战争附加到POM。

注意这种方法,如果你想使用任何其他战争特定的处理,可能会导致你的问题。

生命周期的绑定列在生命周期的介绍中 (参见“默认生命周期绑定 – 打包ejb / ejb3 / jar / par / rar / war”部分)。

要将相关的插件执行绑定到pom包装,您将执行如下操作:

 <build> <plugins> <plugin> <artifactId>maven-resources-plugin</artifactId> <executions> <execution> <id>process-resources</id> <phase>process-resources</phase> <goals> <goal>resources</goal> </goal> </execution> </executions> </plugin> <plugin> <artifactId>maven-compile-plugin</artifactId> <executions> <execution> <id>compile</id> <phase>compile</phase> <goals> <goal>compile</goal> </goal> </execution> </executions> </plugin> <plugin> <artifactId>maven-resources-plugin</artifactId> <executions> <execution> <id>process-test-resources</id> <phase>process-test-resources</phase> <goals> <goal>testResources</goal> </goal> </execution> </executions> </plugin> <plugin> <artifactId>maven-surefire-plugin</artifactId> <executions> <execution> <id>test</id> <phase>test</phase> <goals> <goal>test</goal> </goal> </execution> </executions> </plugin> <!-- package not wanted, install and deploy already defined for pom packaging--> <!--define war:war execution in a profile in case it is needed--> 

我想升级到@迈克尔Wyraz答案,只是包括安装跳过设置,如果有人在多模块项目的顶层执行mvn clean install构build,其中一个子模块是Web应用程序。

这站在战争模块内部:

 <profiles> <profile> <id>war_explode</id> <build> <pluginManagement> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-war-plugin</artifactId> <version>2.6</version> <executions> <execution> <id>default-war</id> <phase>none</phase> </execution> <execution> <id>war-exploded</id> <phase>package</phase> <goals> <goal>exploded</goal> </goals> </execution> </executions> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-install-plugin</artifactId> <executions> <execution> <id>default-install</id> <phase>none</phase> </execution> </executions> </plugin> </plugins> </pluginManagement> </build> </profile> </profiles> 

没有安装跳过构build失败,因为它试图将战争安装到.m2文件夹。 错误消息如下所示:

 [INFO] --- maven-install-plugin:2.4:install (default-install) @ *** --- [INFO] ------------------------------------------------------------------------ [INFO] BUILD FAILURE [INFO] ------------------------------------------------------------------------ [ERROR] Failed to execute goal org.apache.maven.plugins:maven-install-plugin:2.4:install (default-install) on project ***: The packaging for this project did not assign a file to the build artifact -> [Help 1] 

使用这个设置执行mvn clean install -P war_explode (包含在名为war_explode的 mavenconfiguration文件中),它会完成构build而不会出错。

据我所知(我仍然是新手)这是不可能的。 唯一可以跳过的默认生命周期是“testing”。 为了达到部署,你必须打包。 你可以在这里阅读关于执行的默认生命周期顺序的所有信息: http : //maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html#Lifecycle_Reference