从Ant迁移到Maven:如何设置EAR项目?

时间:2017-01-16 21:39:14

标签: maven maven-ear-plugin

我们有一个相当复杂的项目,用于在Ant中构建,但现在我们正在转向Maven。

  1. 核心罐和各种过滤罐依赖于核心罐。
  2. 这些罐子与其他相关的罐子和一些XML文件一起组装成SAR。我在下面打电话给foo-sar
  3. 构建了另一个 JAR ,但此 JAR 不包含任何Java代码,只包含少量应用程序xml文件。我在下面打电话给foo-jar
  4. foo-jarfoo-sar打包到EAR中,application.xml目录中有META-INF个文件。
  5. 我有一个包含三个子项目的Maven项目:

    • foo-jar
    • foo-sar
    • foo-ear

    foo-jarfoo-sar都构建得很好。但是,当foo-ear构建时,它会使用application.xml文件构建耳朵,但不包含foo-jarfoo-sar。我的目录结构如下所示:

    parent Dir --+
                 |
                 +-- foo-ear
                 |
                 +-- foo-jar
                 |
                 +-- foo-sar
    

    父目录pom.xml按正确顺序(foo-sarfoo-jarfoo-ear)调用所有三个项目。 foo-jarfoo-sar都正确构建(即,我匹配了Ant构建的结果)。 foo-ear项目构建没有错误,但它不包括耳朵根中的foo-sarfoo-jar文件。

    我在这里错过了一些非常简单的事情。也许这是一个额外的参数,或其他配置。

    这是Ear的pom.xml

    <project>
      <modelVersion>4.0.0</modelVersion>
    
      <parent>
        <groupId>com.vegicorp.foo</groupId>
        <artifactId>foo-parent</artifactId>
        <version>1.0.0</version>
      </parent>
      <groupId>com.vegicorp.foo</groupId>
      <artifactId>foo-app</artifactId>
      <packaging>ear</packaging>
      <build>
        <plugins>
          <plugin>
            <groupId>org.apache.plugins</groupId>
            <artifactId>maven-ear-plugin</artifactId>
            <version>2.10.1</version>
            <configuration>
              <artifactTypeMappings>
                <!-- The sar is a "jboss-sar" and not just a "sar" -->
                <artifactTypeMapping type="jboss-sar" mapping="sar"/>
              </artifactTypeMappings>
              <modules>
                <jarModule>
                  <artifactId>foo-jar</artifactId>
                  <unpack>true</unpack>
                </jarModule>
                <sarModule>
                  <artifactId>foo-sar</artifactId>
                  <unpack>true</unpack>
                </sarModule>
              </modules>
            </configuration>
          </plugin>
        </plugins>
      </build>
    </project>
    

    新问题

    我意识到我遇到的一个问题是<groupId>设置为org.apache.pluginsorg.apache.maven.plugins设置为maven-ear-plugin。我不知道为什么Maven之前没有检测到这个错误,并且之前给我构建错误。

    设置正确的组后,即使我指定application.xml为false,我也开始注意到<generateApplicationXml>正在构建。我意识到这发生在generate-application-xml目标中,显然默认<configuration>适用于ear目标。因此,我必须分别为<execution>目标和generate-application-xml目标指定ear

    有趣,有趣,有趣。

    除了一个小问题之外,我已经有了生成的耳朵,即使我已经配置了我的模块信息来做一些不同的事情,仍然会下载耳中的依赖项。这是我的pom.xml为耳朵:

    <project>
      <modelVersion>4.0.0</modelVersion>
    
      <parent>
        <groupId>com.vegicorp.foo</groupId>
        <artifactId>foo-parent</artifactId>
        <version>1.0.0</version>
      </parent>
      <groupId>com.vegicorp.foo</groupId>
      <artifactId>foo-app</artifactId>
      <packaging>ear</packaging>
      <build>
        <plugins>
          <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-ear-plugin</artifactId>
            <version>2.10.1</version>
            <executions>
              <execution>
                <id>skip-application-xml-generation</id>
                <phase>package</phase>
                <goals>
                  <goal>generate-application-xml</goal>
                </goals>
                <configuration>
                  <generateApplicationXml>false</generateApplicationXml>
                </configuration>
              </execution>
              <execution>
                <id>create-ear</id>
                <phase>package</phase>
                <goals>
                  <goal>ear</goal>
                </goals>
                <configuration>
                  <artifactTypeMappings>
                    <artifactTypeMapping type="jboss-sar" mapping="sar"/>
                  </artifactTypeMappings>
                  <modules>
                    <jarModule>
                      <groupId>${project.groupId}</groupId>
                      <artifactId>foo-jar</artifactId>
                      <unpack>true</unpack>
                      <uri>FooJar.jar</uri>
                    </jarModule>
                    <sarModule>
                      <groupId>${project.groupId}</groupId>
                      <artifactId>foo-sar</artifactId>
                      <unpack>true</unpack>
                      <uri>Foo.sar</uri>
                    </sarModule>
                  </modules>
                </configuration>
              </execution>
            </executions>
          </plugin>
        </plugins>
      </build>
      <dependencies>
        <dependency>
          <groupId>${project.groupId}</groupId>
          <artifactId>foo-sar</artifactId>
          <version>${project.version}</version>
          <type>sar</type>
          <exclusions>
            <exclusion>
              <groupId>*</groupId>
              <artifactId>*</artifactId>
            </exclusion>
          </exclusions>
        </dependency>
        <dependency>
          <groupId>${project.groupId}</groupId>
          <artifactId>foo-jar</artifactId>
          <version>${project.version}</version>
          <exclusions>
            <exclusion>
              <groupId>*</groupId>
              <artifactId>*</artifactId>
            </exclusion>
          </exclusions>
        </dependency>
      </dependencies>
    </project>
    

    这是生成的耳朵:

    $ ls -l foo-app/target/foo-app-1.0.0
    drwxr-xr-x    3 david  staff       102 Jan 17 11:21 Foo.jar
    drwxr-xr-x  137 david  staff      4658 Jan 17 11:21 Foo.sar
    drwxr-xr-x    4 david  staff       136 Jan 17 11:21 META-INF
    -rw-r--r--    1 david  staff      3905 Jan 17 11:21 foo-1.0.0.jar
    -rw-r--r--    1 david  staff  50104182 Jan 17 11:21 foo-sar-1.0.0.sar
    

    如何配置我的耳朵以防止foo-1.0.0.jarfoo-sar-1.0.0.sar被收录在我耳中?我的耳朵<module>的{​​{1}}部分不应该将我的依赖关系映射到我的模块中吗?

1 个答案:

答案 0 :(得分:0)

我找到了解决方案。可能有一个更好的解决方案,但这是我发现的有效。这是一个巨大的,笨重的,kludge。请随时告诉我我的错误以及正确的方式。

正如arghtype指出的那样,我需要将这些模块添加到我的依赖项中。这样做有用。但是,我发现它还包括我的所有依赖项并将它们下载到我的耳中。考虑到我所包含的一个模块是一个包含其自身大量jar依赖关系的SAR,这真是太愚蠢了。

为了消除依赖关系,我最初在依赖描述中尝试<exclusions>,但这并没有消除添加的jar和sar。我最后做的是在<scope>provided</scope>中加pom.xml以阻止这些下载。

这样可行,但必须有更好的方法:

<project>
  <modelVersion>4.0.0</modelVersion>

  <parent>
    <groupId>com.vegicorp.foo</groupId>
    <artifactId>foo-parent</artifactId>
    <version>1.0.0</version>
  </parent>
  <groupId>com.vegicorp.foo</groupId>
  <artifactId>foo-app</artifactId>
  <packaging>ear</packaging>
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-ear-plugin</artifactId>
        <version>2.10.1</version>
        <executions>
          <execution>
            <id>skip-application-xml-generation</id>
            <phase>package</phase>
            <goals>
              <goal>generate-application-xml</goal>
            </goals>
            <configuration>
              <generateApplicationXml>false</generateApplicationXml>
            </configuration>
          </execution>
          <execution>
            <id>create-ear</id>
            <phase>package</phase>
            <goals>
              <goal>ear</goal>
            </goals>
            <configuration>
              <artifactTypeMappings>
                <artifactTypeMapping type="jboss-sar" mapping="sar"/>
              </artifactTypeMappings>
              <modules>
                <jarModule>
                  <groupId>${project.groupId}</groupId>
                  <artifactId>foo-jar</artifactId>
                  <unpack>true</unpack>
                  <uri>FooJar.jar</uri>
                </jarModule>
                <sarModule>
                  <groupId>${project.groupId}</groupId>
                  <artifactId>foo-sar</artifactId>
                  <unpack>true</unpack>
                  <uri>Foo.sar</uri>
                </sarModule>
              </modules>
            </configuration>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
  <dependencies>
    <dependency>
      <groupId>${project.groupId}</groupId>
      <artifactId>foo-sar</artifactId>
      <version>${project.version}</version>
      <type>sar</type>
      <scope>provided</scope>
    </dependency>
    <dependency>
      <groupId>${project.groupId}</groupId>
      <artifactId>foo-jar</artifactId>
      <version>${project.version}</version>
      <scope>provided</scope>
    </dependency>
  </dependencies>
</project>