9

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

maven-war-plugin对我来说,maven-ear-plugin两者看起来都非常简单,而且似乎他们让我被迫将上述项目视为两个不同的项目,而 WAR 项目是 EAR 项目的依赖项。这似乎有点不方便,特别是因为 WAR 项目的配置文件设置会因每个环境而改变,这似乎会迫使我在每次尝试构建 EAR 时复制该构建调整。

综上所述:有没有一种直接的方法来构建 WAR 并将其打包到这个非常简单的 EAR 中?我想避免将它们作为两个单独的项目进行维护,但同样不希望使用程序集来实现这一点,而不是求助于过于混乱的黑客攻击。

4

3 回答 3

17

综上所述:有没有一种直接的方法来构建 WAR 并将其打包到这个非常简单的 EAR 中?我想避免将它们作为两个单独的项目进行维护,但同样不希望使用程序集来实现这一点,而不是求助于过于混乱的黑客攻击。

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

实际上,我强烈建议不要走 hacky 方式而忘记使用程序集来创建 EAR。相反,创建两个模块,一个具有 type 的包装,war另一个具有 type 的包装,ear具体取决于战争工件,并将它们声明为 parent 的模块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。

于 2009-12-08T22:21:14.893 回答
3

我知道这已经 5 岁了,但它仍然是我搜索时出现的第一个答案。此外,虽然“这不是 maven 方式”对某些人来说是一个完全合理的答案,但其他人可能仍然喜欢像 OP 所要求的那样使用单个 pom,而且它真的没有那么复杂。

首先,创建一个标准的war pom.xml 来生成你想要包含在ear 中的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>

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

接下来,添加一个资源部分以将占位符替换为 war 文件名:

<resources>
  <resource>
    <directory>src/main/application</directory>
    <filtering>true</filtering>
    <includes>
      <include>META-INF/*.xml</include>
    </includes>
  </resource>
</resources>

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

<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>

就是这样。

于 2014-06-20T08:40:39.810 回答
2

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

这是 pom 中richfaces 示例的摘录。

    <plugin>
        <artifactId>maven-war-plugin</artifactId>
        <executions>
          <execution>
            <id>jee5</id>
            <phase>package</phase>
            <goals>
              <goal>war</goal>
            </goals>
            <configuration>
              <webappDirectory>${project.build.directory}/${project.build.finalName}-jee5</webappDirectory>
              <classifier>jee5</classifier>
              <packagingExcludes>WEB-INF/lib/jsf-api*,WEB-INF/lib/jsf-impl*,WEB-INF/lib/el-*</packagingExcludes>
              <warSourceExcludes>WEB-INF/lib/jsf-api*,WEB-INF/lib/jsf-impl*,WEB-INF/lib/el-*</warSourceExcludes>
            </configuration>
          </execution>
          <execution>
            <id>tomcat6</id>
            <phase>package</phase>
            <goals>
              <goal>war</goal>
            </goals>
            <configuration>
              <webappDirectory>${project.build.directory}/${project.build.finalName}-tomcat6</webappDirectory>
              <classifier>tomcat6</classifier>
              <packagingExcludes>WEB-INF/lib/el-*</packagingExcludes>
              <warSourceExcludes>WEB-INF/lib/el-*</warSourceExcludes>
            </configuration>
          </execution>
        </executions>
        <configuration>
          <webResources>
            <resource>
              <directory>${basedir}/src/main/java</directory>
              <targetPath>/WEB-INF/src</targetPath>
            </resource>
          </webResources>
        </configuration>
      </plugin>

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

<profile>
  <id>jee5</id>
  <dependencies>
     <dependency>
       <groupId>org.richfaces.samples</groupId>
       <artifactId>richfaces-demo</artifactId>
       <version>${richfaces-version}</version>
       <classifier>jee5</classifier>
       <type>war</type>
       <scope>runtime</scope>
     </dependency>
  </dependencies>
</profile>   
于 2009-12-08T22:31:49.333 回答