从 EAR 中排除文件

通过使用<packagingIncludes><packagingExcludes>配置参数,可以从 EAR 中排除某些文件。它们每个都采用逗号分隔的 Ant 文件集模式列表。您可以使用通配符,例如**指示多个目录以及*指示文件或目录名称的可选部分。

共享库

一个用例是如果您想在应用程序服务器中使用共享库。这涉及在应用程序服务器中配置一个位置,该位置包含您希望在多个 EAR 之间共享的一些库。这有点像瘦 WARs,但被带到了一个新的水平。使用瘦 WAR,您可以在企业应用程序内的 Web 应用程序之间共享库 (JAR)。此处描述的共享库在企业应用程序之间共享库 (JAR)。

例如,假设我们要从生成的 EAR 中排除所有非内部构件,以便我们分发的 EAR 文件只包含我们自己的构件。我们希望将其他依赖项放入应用服务器上的共享库中。它们只会使我们的 EAR 文件膨胀,尤其是在我们构建或部署多个 EAR 时,每个 EAR 中都包含所有这些依赖项。

在此示例中,我们的公司 Acme Corporation 明智地为其所有内部工件设置了命名约定。artifactId 总是以“acme-”为前缀。如果他们不使用共享库,他们的应用程序的目录布局可能如下所示:

 acme-ear-1
 |-- acme-ejb-1.jar
 |-- acme-library-1.jar
 |-- acme-library-2.jar
 |-- acme-war-1.war
 |-- acme-war-2.war
 |-- external-library-1.jar
 |-- external-library-2.jar
 `-- external-library-3.jar

 acme-ear-2
 |-- acme-ejb-1.war
 |-- acme-library-1.jar
 |-- acme-library-2.jar
 |-- acme-war-3.war
 |-- acme-war-4.war
 |-- external-library-2.jar
 |-- external-library-3.jar
 `-- external-library-4.jar

配置 EAR

为了避免复制外部库,我们需要做两件事。首先,我们确保我们的 EAR 只包含我们自己的工件。我们使用参数来执行此操作,该<packagingIncludes>参数告诉 EAR 插件哪些文件要包含在 EAR 中。其他一切都将被排除在外。此配置应在 Acme 的所有 EAR 项目中使用,因此最好将此配置移动到由 Acme 的所有 EAR 项目共享的父级。

<project>
  ...
  <build>
    <plugins>
      <plugin>
        <artifactId>maven-ear-plugin</artifactId>
        <version>3.2.0</version>
        <configuration>
          <packagingIncludes>META-INF/**,**/acme-*.jar,**/acme-*.war</packagingIncludes>
        </configuration>
      </plugin>
    </plugins>
  </build>
  ...
</project>

创建共享库 EAR

接下来,我们创建一个共享库 EAR,其中包含我们希望在 EAR 之间共享的所有依赖项。在此示例中,我们将共享库打包为 EAR。您可以使用的打包类型因应用程序服务器而异。

注意:<version>为简洁起见,此处省略了依赖项的元素。

<project>
  ...
  <artifactId>external-shared-libraries</artifactId>
  <packaging>ear</packaging>
  ...
  <dependencies>
    <dependency>
      <groupId>com.external.supplier</groupId>
      <artifactId>external-library-1.jar</artifactId>
    </dependency>
    <dependency>
      <groupId>com.external.supplier</groupId>
      <artifactId>external-library-2.jar</artifactId>
    </dependency>
    <dependency>
      <groupId>com.external.supplier</groupId>
      <artifactId>external-library-3.jar</artifactId>
    </dependency>
    <dependency>
      <groupId>com.external.supplier</groupId>
      <artifactId>external-library-4.jar</artifactId>
    </dependency>
  </dependencies>
  ...
  <build>
    <plugins>
      <plugin>
        <artifactId>maven-ear-plugin</artifactId>
        <version>3.2.0</version>
      </plugin>
    </plugins>
  </build>
  ...
</project>

结果

完成所有 Maven 配置后,生成的目录布局将如下所示:

 external-shared-libraries
 |-- external-library-1.jar
 |-- external-library-2.jar
 |-- external-library-3.jar
 `-- external-library-4.jar

 acme-ear-1
 |-- acme-ejb-1.jar
 |-- acme-library-1.jar
 |-- acme-library-2.jar
 |-- acme-war-1.war
 `-- acme-war-2.war

 acme-ear-2
 |-- acme-ejb-1.war
 |-- acme-library-1.jar
 |-- acme-library-2.jar
 |-- acme-war-3.war
 `-- acme-war-4.war

注意:您还需要将应用程序服务器配置external-shared-libraries为用作共享库。但是,您如何做到这一点超出了本示例的范围。

传递工件

对于那些有充分理由排除传递依赖的人,他们可以pom.xml在使用 Maven3 时这样配置

  <dependency>
    <groupId>GROUPID</groupId>
    <artifactId>ARTIFACTID</artifactId>
    <version>VERSION</version>
    <exclusions>
      <exclusion>
        <groupId>*</groupId>
        <artifactId>*</artifactId>
      </exclusion>
    </exclusions>
  </dependency>

正如您所看到exclusions的,支持通配符表达式,因此您可以快速且完全地控制您想要排除的所有依赖项。