2

我们有一个相当复杂的项目,过去是在 Ant 中构建的,但现在我们正在迁移到 Maven。

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

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

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

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

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

父目录pom.xml以正确的顺序(、、和)调用所有foo-sar三个foo-jar项目foo-ear。两者都foo-jar正确foo-sar构建(即,我已经匹配了 Ant 构建的结果)。该foo-ear项目构建没有错误,但它不包括耳朵根目录中的foo-sar和文件。foo-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而不是org.apache.maven.pluginsmaven-ear-plugin. 我不知道为什么 Maven 之前没有检测到这个错误并且之前给我构建错误。

一旦我设置了正确的组,我开始注意到application.xml正在构建,即使我指定这<generateApplicationXml>是错误的。我意识到这发生在generate-application-xml目标中,显然默认值<configuration>是针对ear目标的。因此,我必须分别指定<execution>目标generate-application-xmlear目标。

好玩,好玩,好玩。

除了一个小问题外,我已经生成了耳朵,尽管我已经将模块信息配置为做一些不同的事情,但无论如何都会下载耳朵中的依赖项。这是我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 中?<module>我的耳朵部分不<configuration>应该将我的依赖项映射到我的模块中吗?

4

1 回答 1

0

我找到了解决方案。可能有一个更好的解决方案,但这是我发现的。这是一个巨大的,笨重的,kludge。随时让我知道我有多么错误以及应该做的正确方法。

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

为了消除依赖,我最初尝试<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>
于 2017-01-18T15:54:11.557 回答