在Maven2中,构建WAR和EAR以在单个POM中包含该WAR的最简单方法是什么?

情况非常简单。 我有一个Java webapp,我正在转换为使用Maven构建。 目前,应用程序使用Ant构建到单个WAR文件中,然后使用非常简单的application.xml将其捆绑到EAR中。

maven-war-pluginmaven-ear-plugin对我来说都很简单,而且看起来他们让我把上述视为两个截然不同的项目,将WAR项目作为EAR项目的依赖项。 这似乎有点不方便,特别是因为WAR项目的配置文件设置将针对每个环境进行更改,这似乎会强制我在每次尝试构建EAR时复制该构建调整。

所有这些都说:是否有一种简单的方法来构建WAR并将其打包到这个简单易用的EAR中? 我想避免将它们作为两个单独的项目进行维护,但同样也不愿意使用程序集来实现这一目标。

所有这些都说:是否有一种简单的方法来构建WAR并将其打包到这个简单易用的EAR中? 我想避免将它们作为两个单独的项目进行维护,但同样也不愿意使用程序集来实现这一目标。

简短回答: ,没有简单的maven方法可以做到这一点,因为这会违反Maven规则,即“每个项目一个工件”(理解每个项目的一个输出,99%的情况都是如此)。

实际上,我强烈建议不要采用hacky方式并忘记使用程序集来创建EAR。 相反,创建两个模块,一个包含war类型的包,另一个包含ear类型的包,具体取决于war工件,并将它们声明为父pom.xml模块。 喜欢这个:

 my-project |-- pom.xml // packaging of type pom and my-war and my-ear as modules |-- my-war | `-- pom.xml // packaging of type war `-- my-ear `-- pom.xml // packaging of type ear 

如果你选择Maven,采用Maven哲学,不要反对它,它会为你节省很多痛苦。 说真的,黑客组件做maven-ear-plugin已经做的事情只是反DRY。 在这种情况下你最好坚持使用Ant。

在Maven中,每个项目都会产生一个aritifact。 在你的情况下,我建议创建两个项目一个用于战争,一个用于耳朵。 如果您需要多个版本的项目,您可以使用分类器和配置文件来实现。

这是richfaces示例pom的摘录。

   maven-war-plugin   jee5 package  war   ${project.build.directory}/${project.build.finalName}-jee5 jee5 WEB-INF/lib/jsf-api*,WEB-INF/lib/jsf-impl*,WEB-INF/lib/el-* WEB-INF/lib/jsf-api*,WEB-INF/lib/jsf-impl*,WEB-INF/lib/el-*    tomcat6 package  war   ${project.build.directory}/${project.build.finalName}-tomcat6 tomcat6 WEB-INF/lib/el-* WEB-INF/lib/el-*       ${basedir}/src/main/java /WEB-INF/src     

在您的耳中使用配置文件通过适当的分类器导入所需的依赖项。

  jee5   org.richfaces.samples richfaces-demo ${richfaces-version} jee5 war runtime    

我知道现在已经5岁了,但它仍然是我搜索时出现的第一个答案。 此外,虽然“这不是maven方式”对于某些人来说是一个非常合理的答案,但其他人可能仍然喜欢使用单个pom,因为OP问,并且它实际上并不复杂。

首先,创建一个标准的war pom.xml来生成要包含在耳中的war文件。 把包装当作战争。

然后使用war文件名的占位符编写自己的application.xml(在src / main / application或wherever中):

    ${project.build.finalName}.war myapp    

并在同一位置包含任何其他特定于服务器的xml文件(weblogic-application.xml等)。

接下来,添加资源部分以使用war文件名替换占位符:

   src/main/application true  META-INF/*.xml    

最后,添加一个ant耳朵任务来构建耳朵:

  maven-antrun-plugin   package  run             

就是这样。