创建瘦模块
这有点像瘦 WARs,但被带到了一个新的水平并应用于 EAR 类型的模块:
从版本 3.2.0 开始,Maven EAR 插件支持通过Class-Path
EAR 模块中的设置引用打包在 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.MF
EAR 的 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>