创建瘦 WAR

在典型的 J2EE 环境中,WAR 封装在 EAR 中以进行部署。WAR 可以在WEB-INF/lib中包含其所有依赖的 JAR,但是如果有多个 WAR,由于存在重复的 JAR,EAR 会很快变得非常大。相反,J2EE 规范允许 WAR 通过MANIFEST.MF中的Class-Path设置来引用打包在 EAR 中的外部 JAR 。

Maven EAR 插件直接支持创建瘦战争,这意味着相应地配置 maven-ear-plugin

您需要更改 EAR 项目的pom.xml以将这些依赖的 JAR 打包到 EAR 中。请注意,我们将所有内容打包到EAR 中的lib/目录中。这只是我个人对区分 J2EE 模块(将被打包在 EAR 的根目录中)和 Java 库(将被打包在lib/中)的偏好。

  ...
  <build>
    <plugins>
      <plugin>
        <artifactId>maven-ear-plugin</artifactId>
        <version>2.9.1</version>
        <configuration>
          <defaultLibBundleDir>lib/</defaultLibBundleDir>
          <skinnyWars>true</skinnyWars>
        </configuration>
      </plugin>
    </plugins>
  </build>
  ...

现在是痛苦的部分。您的 EAR 项目的pom.xml需要列出 WAR 具有的每个依赖项。这是因为 Maven 假定胖 WAR 并且不包括 EAR 中 WAR 的传递依赖。

  ....
  <dependencies>
    <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>
  ...

您的 EAR 将包含如下内容:

 .
 |-- META-INF
 |   `-- application.xml
 |-- lib
 |   `-- shared-jar-1.0.0.jar
 |-- war1-1.0.0.war
 `-- war2-1.0.0.war

备择方案

我们的用户已在 Wiki上提交了上述配方的替代方案。