在典型的 J2EE 环境中,WAR 封装在 EAR 中以进行部署。WAR 可以在WEB-INF/lib中包含其所有依赖的 JAR,但是如果有多个 WAR,由于存在重复的 JAR,EAR 会很快变得非常大。相反,J2EE 规范允许 WAR 通过MANIFEST.MF中的Class-Path设置来引用打包在 EAR 中的外部 JAR 。
从 2.7 版开始,Maven EAR 插件基本支持这种操作模式。
首先,我们需要更改 EAR 项目的pom.xml以使用skinnyWars参数将这些 JAR 打包到 EAR 中。
注意:在本例中,我们将所有 JAR 打包到EAR 中的lib/目录中。这只是为了区分 J2EE 模块(将打包在 EAR 的根目录中)和 Java 库(打包在lib/中)。
<project>
...
<build>
<plugins>
<plugin>
<artifactId>maven-ear-plugin</artifactId>
<version>3.0.0</version>
<configuration>
<defaultLibBundleDir>lib/</defaultLibBundleDir>
<skinnyWars>true</skinnyWars>
</configuration>
</plugin>
</plugins>
</build>
...
</project>现在是痛苦的部分。您的 EAR 项目的pom.xml需要列出您希望通过 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>war1</artifactId>
<version>1.0.0</version>
<type>war</type>
</dependency>
<dependency>
<groupId>com.acme</groupId>
<artifactId>war2</artifactId>
<version>1.0.0</version>
<type>war</type>
</dependency>
</dependencies>
...
</project>您的 EAR 将包含如下内容:
. |-- META-INF | `-- application.xml |-- lib | `-- shared-jar-1.0.0.jar |-- war1-1.0.0.war `-- war2-1.0.0.war
如果您查看 EAR 中打包的war1-1.0.0.war和war2-1.0.0.war的副本,您会发现它们不再包含文件WEB-INF/lib/shared-jar- 1.0.0.jar。
此外,如果您检查 WAR 的MANIFEST.MF,您会注意到Class-Path条目已被修改,并且现在具有对lib/shared-jar-1.0.0.jar 的引用。