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