代码之家  ›  专栏  ›  技术社区  ›  Justin Searls

在Maven2中,构建一场战争的最简单方法是什么?用一个POM来控制战争的耳朵是什么?

  •  8
  • Justin Searls  · 技术社区  · 15 年前

    情况很简单。我有一个Java Web应用程序,我正在用Maven构建它。目前,该应用程序是用Ant构建成一个单独的war文件,然后用一个非常简单的application.xml将其绑定到EAR中。

    maven-war-plugin maven-ear-plugin 对我来说,这两个项目看起来都很直接,而且他们似乎让我不得不将上述两个项目视为两个不同的项目,战争项目是EAR项目的一个依赖项。这似乎有点不方便,尤其是因为战争项目的配置文件设置会因每个环境而改变,这似乎会迫使我在每次尝试构建耳朵时重复构建调整。

    所有这些都要说:有没有一个直接的方法来建立战争并将其打包到这个简单的耳朵里?我希望避免将它们作为两个独立的项目来维护,但同样地,我不希望借助于使用程序集来完成这一任务的过于混乱的黑客。

    3 回复  |  直到 10 年前
        1
  •  17
  •   Pascal Thivent    15 年前

    所有这些都要说:有没有一个直接的方法来建立战争并将其打包到这个简单的耳朵里?我希望避免将它们作为两个独立的项目来维护,但同样地,我不希望借助于使用程序集来完成这一任务的过于混乱的黑客。

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

    实际上,我强烈建议 走老路,忘了用装配来制造耳朵。相反,创建两个模块,一个模块的包装类型为 war ,另一个包装类型为 ear 取决于战争工件,并将其声明为父对象的模块 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插件已经做的只是防干。在这种情况下,你最好还是坚持蚂蚁。

        2
  •  2
  •   Jean-Rémy Revy vasquez    12 年前

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

    这是richfaces示例pom的摘录。

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

    在您的EAR中,pom使用概要文件导入所需的依赖项和适当的分类器。

    <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>   
    
        3
  •  2
  •   Barney    10 年前

    我知道这已经5岁了,但这仍然是我搜索的第一个答案。另外,虽然“这不是特立独行的方式”对一些人来说是一个完全合理的答案,但其他人可能仍然喜欢使用一个单一的POM作为OP的要求,而且它并没有那么复杂。

    首先,创建一个标准的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>
    

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

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

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

    最后,添加一个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>
    

    就是这样。

    推荐文章