Java 在Maven2中,什么';在一个POM中构建战争和遏制战争的EAR的最简单方法是什么?

Java 在Maven2中,什么';在一个POM中构建战争和遏制战争的EAR的最简单方法是什么?,java,maven-2,pom.xml,maven-war-plugin,maven-ear-plugin,Java,Maven 2,Pom.xml,Maven War Plugin,Maven Ear Plugin,情况很简单。我有一个Java Web应用程序,我正在转换为使用Maven构建。目前,该应用程序使用Ant构建到单个WAR文件中,然后通过一个非常简单的application.xml将其捆绑到EAR中 < Maven战争插件> />代码> Maven耳插件< /代码>对我来说都很简单,看起来它们让我不得不把上面提到的两个不同的项目看作是一个依赖于EAR项目的战争项目。这似乎有点不方便,特别是因为WAR项目的配置文件设置会因每个环境而改变,这似乎会迫使我在每次尝试构建EAR时重复构建调整 所有这些

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

< Maven战争插件> />代码> Maven耳插件< /代码>对我来说都很简单,看起来它们让我不得不把上面提到的两个不同的项目看作是一个依赖于EAR项目的战争项目。这似乎有点不方便,特别是因为WAR项目的配置文件设置会因每个环境而改变,这似乎会迫使我在每次尝试构建EAR时重复构建调整

所有这些都是为了说明:有没有一种直接的方法来构建战争并将其打包到这个简单的耳朵中?我希望避免将它们作为两个独立的项目来维护,但同样地,我也不希望使用程序集来实现这一点,而诉诸于过于混乱的hack

所有这些都是为了说明:有没有一种直接的方法来构建战争并将其打包到这个简单的耳朵中?我希望避免将它们作为两个独立的项目来维护,但同样地,我也不希望使用程序集来实现这一点,而诉诸于过于混乱的hack

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

事实上,我强烈建议不要走老套的路,忘记使用程序集来创建耳朵。相反,创建两个模块,一个具有
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插件已经在做的事情是不安全的。在这种情况下,你最好坚持使用Ant。

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

这是richfaces示例pom的摘录


maven战争插件
老天爷
包裹
战争
${project.build.directory}/${project.build.finalName}-5
老天爷
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
包裹
战争
${project.build.directory}/${project.build.finalName}-tomcat6
tomcat6
WEB-INF/lib/el-*
WEB-INF/lib/el-*
${basedir}/src/main/java
/WEB-INF/src
在您的ear pom中,使用概要文件导入具有适当分类器的所需依赖项


老天爷
org.richfaces.samples
richfaces演示
${richfaces版本}
老天爷
战争
运行时

我知道这已经5年了,但这仍然是我搜索时找到的第一个答案。此外,虽然“这不是maven的方式”对一些人来说是一个完全合理的答案,但其他人可能仍然喜欢按照OP的要求使用一个pom,而且它实际上并没有那么复杂

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

然后使用war文件名的占位符编写您自己的application.xml(在src/main/application或任何地方):

<application xmlns="http://java.sun.com/xml/ns/javaee" ... >
  <module>
    <web>
      <web-uri>${project.build.finalName}.war</web-uri>
      <context-root>myapp</context-root>
    </web>
  </module>
</application>
<resources>
  <resource>
    <directory>src/main/application</directory>
    <filtering>true</filtering>
    <includes>
      <include>META-INF/*.xml</include>
    </includes>
  </resource>
</resources>

${project.build.finalName}.war
myapp
并在同一位置包含任何其他特定于服务器的xml文件(weblogic-application.xml等)

接下来,添加一个参考资料部分,用war文件名替换占位符:

<application xmlns="http://java.sun.com/xml/ns/javaee" ... >
  <module>
    <web>
      <web-uri>${project.build.finalName}.war</web-uri>
      <context-root>myapp</context-root>
    </web>
  </module>
</application>
<resources>
  <resource>
    <directory>src/main/application</directory>
    <filtering>true</filtering>
    <includes>
      <include>META-INF/*.xml</include>
    </includes>
  </resource>
</resources>

src/main/application
真的
META-INF/*.xml
最后,添加一个ant ear任务来构建ear:

<plugin>
  <artifactId>maven-antrun-plugin</artifactId>
  <executions>
    <execution>
      <phase>package</phase>
      <goals>
        <goal>run</goal>
      </goals>
      <configuration>
        <tasks>
          <ear destfile="${project.build.directory}/${project.build.finalName}.ear"
               appxml="${project.build.outputDirectory}/META-INF/application.xml">
            <fileset dir="${project.build.outputDirectory}" includes="META-INF/*.xml"/>
            <fileset dir="${project.build.directory}" includes="${project.build.finalName}.war"/>
          </ear>
        </tasks>
      </configuration>
    </execution>
  </executions>
</plugin>

maven antrun插件
包裹
跑

就是这样。

不管它值多少钱,我并不是在提倡采取黑客手段/对抗Maven,我只是感觉到除了创建多个项目/模块之外没有其他出路。我提出这个问题只是为了确认,事实上,在一个项目中没有一种干净的方式来完成这一点。因此,我将按照您上面概述的布局进行规划。