如何让Maven 2构建2个单独的WAR文件

在进行mvn install我希望在目标目录中最终得到2个WAR文件。 一个将包含生产 web.xml ,另一个将包含test / uat web.xml

我试过这个:

  cas-server   org.apache.maven.plugins maven-war-plugin 2.1-beta-1  src/main/config/prod/web.xml cas-prod    org.apache.maven.plugins maven-war-plugin 2.1-beta-1  src/main/config/test/web.xml cas-test     

但我最终只得到测试WAR。

我不认为你可以一步到位(实际上,我很惊讶Maven没有抱怨你的设置,并想知道哪一个被应用)我建议使用配置文件,也许过滤来管理这个用途案件。

如果您的web.xml确实不同,您可以将maven-war-plugin配置放在两个配置文件中。 或者,更好的是,你可以将它们合并成这样的东西:

  org.apache.maven.plugins maven-war-plugin 2.1-beta-1  src/main/config/${env}/web.xml cas-test   

并在两个配置文件中设置env属性,以便在构建时选择正确的web.xml

   uat  test    prod  prod    

如果您的web.xml是相似的(即,如果它们的值不同),您可以在两个配置文件中定义属性及其值,并使用过滤来应用它们。 像这样的东西:

   env-uat   env uat    uat_value_key_1 uat_value_key_n    env-prod   env prod    prod_value_key_1 prod_value_key_n    

然后通过在命令行上传递env属性来激活一个配置文件或另一个配置文件,例如:

 mvn -Denv=uat package 

另一种选择是将值放入特定的filter中,并在构建时选择正确的filter(如本文中所述 )。

有很多选择,但正如我所说,我不认为你可以做到这一点,如果没有runngin构建两次。

有关配置文件/过滤的更多资源

  • Maven Book:第11章。构建配置文件
  • Maven Book:第15.3章。 资源过滤
  • 构建配置文件简介
  • 在测试阶段使用备用Maven配置文件
  • Google上的maven个人资料过滤搜索

您可以告诉Maven Assembly插件只生成两个程序集。 您只需为要创建的每个输出编写汇编描述符文件,并在插件配置中列出它们。

例如,我使用它来生成WAR文件和TGZ文件,但是没有理由不能以相同的方式执行两个WAR。 然后mvn包将生成这两个文件。

   maven-assembly-plugin 2.3   src/main/assembly/assembly-war.xml src/main/assembly/assembly-dist.xml     dist-assembly package  single     

我通常建议使用配置文件并运行两个专用版本。 但是,应该可以使用maven-assembly-plugin创建任意数量的工件。

我认为这只能通过编写自定义Maven插件或干扰构建生命周期并运行两次战争组装过程来实现(这只是一个微弱的想法)。

也许您可以创建两个配置文件并使用不同的配置文件( mvn -P prof1 packagemvn -P prof2 package )运行目标两次,但是要小心生成的工件名称,不应该覆盖它们。 或者您可以创建一个使用其他插件并组装两个war文件的自定义插件。

虽然我不使用Maven而是使用Ivy ,但这里通常是这样的:

将您自己的应用程序发布到私有存储库/类似于JAR及其依赖项/其他静态内容,然后发布单个项目设置,以使用特定于上下文的配置构建应用程序的部署特定WAR。 现在,通过构建任何单独的部署项目,您可以获得具有特定于构建的配置的实际应用程序的最新版本。

我认为,由于这在Ivy中是微不足道的,Maven应该能够轻松地完成它。

丑陋的黑客攻击(它破坏了Maven宣称意图而不是行动的想法),但对我有用:我必须生成两个共享相同后端代码库的战争,但在MVC控制器包上有所不同。

在用几个插件敲打我的头后,我想“嘿,我会在ant中轻松做到”,这导致我使用在“包”阶段产生战争(我们已经准备好了)拥有所有文件)。 有点像:

  maven-antrun-plugin 1.3   package  run                     

(公平地说,我没有删除原始文件,但你应该可以这样做。)

在您的情况下,您可以在没有备用web.xml的情况下打包一场战争,将其重命名/移动到原始web.xml上,然后打包第二次战争。