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

Moving From Ant to Maven: How do I setup an EAR Project?

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

  1. 有一个核心罐子和依赖于核心罐子的各种过滤罐子。
  2. 这些 jar 与其他依赖的 jar 和一些 XML 文件一起组装成一个 SAR。我在下面称之为 foo-sar
  3. 构建了另一个 JAR,但是这个 JAR 不包含任何 Java 代码,只有一些应用程序 xml 文件。我在下面称之为 foo-jar
  4. foo-jarfoo-sar 被打包到一个 EAR 中,在 META-INF 目录中找到一个 application.xml 文件。

我有一个包含三个子项目的 Maven 项目:

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

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

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

我在这里遗漏了一些非常简单的东西。也许这是一个额外的参数,或者另一个配置。

这是耳朵的 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.plugins 而不是 maven-ear-pluginorg.apache.maven.plugins。我不知道为什么 Maven 之前没有检测到这个错误并在之前给我构建错误。

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

有趣,有趣,有趣。

我已经得到了 ear 来生成 除了一个小问题 ,即使我已经配置了我的模块信息来做一些事情,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

如何配置我的 Ear 以防止 foo-1.0.0.jarfoo-sar-1.0.0.sar 被包含在我的 Ear 中?我的耳朵 <configuration><module> 部分不应该将我的依赖项映射到我的模块中吗?

我找到了解决办法。可能有更好的解决方案,但这是我发现有效的方法。这是一个大而笨重的杂物。请随时让我知道我错了多少,以及正确应该这样做的方式。

正如 arghtype 指出的那样,我需要将这些模块添加到我的依赖项中。这样做有效。但是,我发现它还包括我所有的依赖项,并将它们也下载到我的 Ear 中。考虑到我包含的模块之一是一个 SAR,它包含大量的 jar 依赖项,这很愚蠢。

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

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

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