You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

含EJB与WAR的EAR工程Maven问题:共享WAR依赖不加入EJB清单

解决Skinny Wars模式下共享WAR依赖但不污染EJB Manifest的问题

核心思路

通过在maven-ear-plugin的配置中,针对EJB模块显式排除共享依赖的Manifest引用,既保留EAR/lib中的共享Jar供WAR使用,又避免EJB的Manifest.MF生成不必要的Class-Path条目。

具体配置步骤

  1. 保留EAR POM中的共享依赖
    不要移除或标记为<optional>true</optional>,确保该依赖会被打包到EAR的lib/目录:

    <dependencies>
        <dependency>
            <groupId>your.group.id</groupId>
            <artifactId>my.shared.war.dependency</artifactId>
            <version>your.version</version>
        </dependency>
        <!-- 其他EJB、WAR模块依赖 -->
    </dependencies>
    
  2. 配置maven-ear-plugin排除EJB模块的共享依赖引用
    在EAR的maven-ear-plugin配置中,为EJB模块添加<excludedDependencies>,指定要排除的共享依赖:

    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-ear-plugin</artifactId>
        <version>3.3.0</version> <!-- 使用适配你项目的版本 -->
        <configuration>
            <skinnyWars>true</skinnyWars>
            <defaultLibBundleDir>lib/</defaultLibBundleDir>
            <modules>
                <!-- 配置EJB模块,排除共享依赖 -->
                <ejbModule>
                    <groupId>your.group.id</groupId>
                    <artifactId>your-ejb-module</artifactId>
                    <excludedDependencies>
                        <excludedDependency>
                            <groupId>your.group.id</groupId>
                            <artifactId>my.shared.war.dependency</artifactId>
                        </excludedDependency>
                    </excludedDependencies>
                </ejbModule>
                <!-- 配置所有WAR模块,无需额外排除,默认会引用EAR/lib中的共享依赖 -->
                <webModule>
                    <groupId>your.group.id</groupId>
                    <artifactId>your-war-module-1</artifactId>
                </webModule>
                <webModule>
                    <groupId>your.group.id</groupId>
                    <artifactId>your-war-module-2</artifactId>
                </webModule>
            </modules>
        </configuration>
    </plugin>
    
  3. 优化WAR模块的依赖配置(可选但推荐)
    在每个WAR模块的POM中,将共享依赖标记为<scope>provided</scope>,明确告知Maven该依赖由EAR提供,避免WAR打包时重复引入:

    <dependencies>
        <dependency>
            <groupId>your.group.id</groupId>
            <artifactId>my.shared.war.dependency</artifactId>
            <version>your.version</version>
            <scope>provided</scope>
        </dependency>
        <!-- 其他WAR专属依赖 -->
    </dependencies>
    

为什么之前的方法无效?

  • 方法A(移除EAR中的依赖):EAR的lib/目录不再包含共享Jar,WAR只能将依赖打包到自身的lib/,直接破坏Skinny Wars的共享设计。
  • 方法B(标记依赖为optional):Maven会将该依赖视为非必须,不会将其放入EAR的lib/,最终结果和方法A一致。

内容的提问来源于stack exchange,提问作者Roger Spall

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.11 21:42:37