创建瘦模块
这有点像瘦 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>


