创建瘦模块
这有点像瘦 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.jar、shared-jar-1.0.0.jar和lib/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>


