创建瘦模块

这有点像瘦 WARs,但被带到了一个新的水平并应用于 EAR 类型的模块:

从版本 3.2.0 开始,Maven EAR 插件支持通过Class-PathEAR 模块中的设置引用打包在 EAR 中的外部 JAR MANIFEST.MF

您需要更改 EAR 项目pom.xml以将这些 JAR 打包到 EAR 中并使用skinnyModules参数。

注意:在本例中,我们将所有 JAR 打包到libs/EAR 中的一个目录中。这只是为了区分 Java EE 模块(将打包在 EAR 的根目录中)和 Java 库(打包在 EAR 中libs/)。此外,我们使用非标准outputFileNameMapping来缩短打包在 EAR 中的文件的名称,并使它们与本地存储库中使用的名称接近,以提高可读性。

<project>
  ...
  <dependencies>
    <!-- This is the JAR we want to share -->
    <dependency>
      <groupId>com.acme</groupId>
      <artifactId>shared-jar</artifactId>
      <version>1.0.0</version>
    </dependency>
    <dependency>
      <groupId>com.acme</groupId>
      <artifactId>war</artifactId>
      <version>1.0.0</version>
      <type>war</type>
    </dependency>
    <dependency>
      <groupId>com.acme</groupId>
      <artifactId>rar</artifactId>
      <version>1.0.0</version>
      <type>rar</type>
    </dependency>
    <dependency>
      <groupId>com.acme</groupId>
      <artifactId>sar</artifactId>
      <version>1.0.0</version>
      <type>sar</type>
    </dependency>
  </dependencies>
  ...
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-ear-plugin</artifactId>
        <version>3.2.0</version>
        <configuration>
          <outputFileNameMapping>@{artifactId}@-@{version}@@{dashClassifier?}@.@{extension}@</outputFileNameMapping>
          <defaultLibBundleDir>libs/</defaultLibBundleDir>
          <skinnyModules>true</skinnyModules>
        </configuration>
      </plugin>
    </plugins>
  </build>
  ...
</project>

您的 EAR 将包含如下内容:

 .
 |-- META-INF
 |   `-- application.xml
 |-- libs
 |   `-- shared-jar-1.0.0.jar
 |-- war-1.0.0.war
 |-- sar-1.0.0.sar
 `-- rar-1.0.0.rar

war-1.0.0.war如果您查看 EAR 中打包的、rar-1.0.0.ear和的副本sar-1.0.0.sar,您将看到它们不再分别包含WEB-INF/lib/shared-jar-1.0.0.jarshared-jar-1.0.0.jarlib/shared-jar-1.0.0.jar文件。

此外,如果您检查MANIFEST.MFEAR 的 WAR、SAR 和 HAR 模块,您会注意到该Class-Path条目已被修改或添加,如果它丢失了,现在有一个对libs/shared-jar-1.0.0.jar.

如果表示 EAR 模块的存档具有库的非标准位置,则可以使用该libDirectory属性配置此位置。

这是 SAR 的示例,其中包含存档根目录中的库(有关属性的描述,请参阅sarModulelibDirectory):

<project>
  ....
  <dependencies>
    <!-- This is the JAR we want to share -->
    <dependency>
      <groupId>com.acme</groupId>
      <artifactId>shared-jar</artifactId>
      <version>1.0.0</version>
    </dependency>
    <dependency>
      <groupId>com.acme</groupId>
      <artifactId>war</artifactId>
      <version>1.0.0</version>
      <type>war</type>
    </dependency>
    <dependency>
      <groupId>com.acme</groupId>
      <artifactId>rar</artifactId>
      <version>1.0.0</version>
      <type>rar</type>
    </dependency>
    <!-- SAR having shared-jar-1.0.0.jar at the root -->
    <dependency>
      <groupId>com.acme</groupId>
      <artifactId>sar</artifactId>
      <version>1.0.0</version>
      <type>sar</type>
    </dependency>
  </dependencies>
  ...
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-ear-plugin</artifactId>
        <version>3.2.0</version>
        <configuration>
          <outputFileNameMapping>@{artifactId}@-@{version}@@{dashClassifier?}@.@{extension}@</outputFileNameMapping>
          <defaultLibBundleDir>libs/</defaultLibBundleDir>
          <skinnyModules>true</skinnyModules>
          <modules>
            <sarModule>
              <groupId>com.acme</groupId>
              <artifactId>sar</artifactId>
              <libDirectory>/</libDirectory>
            </sarModule>
          </modules>
        </configuration>
      </plugin>
    </plugins>
  </build>
  ...
</project>