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

WildFly 29中EJB双向调用引发Maven循环依赖问题求助

解决WildFly Domain中EJB项目互相调用的Maven循环依赖问题

问题核心

A、B两个项目的EJB模块需要互相调用,导致双方pom.xml都要引入对方的ejb-client依赖,触发Maven循环依赖,构建失败。

可行解决方案

方案1:提取公共API模块(推荐)

将A、B互相调用所需的远程业务接口抽离到独立的公共模块,彻底打破循环依赖:

  1. 新建common-api模块,仅存放接口代码,不包含实现类
  2. 主pom.xml添加该模块:
<modules>
    <module>common-api</module>
    <module>A</module>
    <module>B</module>
</modules>
  1. common-api的pom.xml仅保留API级依赖:
<dependencies>
    <dependency>
        <groupId>jakarta.ejb</groupId>
        <artifactId>jakarta.ejb-api</artifactId>
        <scope>provided</scope>
        <version>4.0.0</version>
    </dependency>
    <dependency>
        <groupId>jakarta.annotation</groupId>
        <artifactId>jakarta.annotation-api</artifactId>
        <scope>provided</scope>
        <version>2.0.0</version>
    </dependency>
</dependencies>
  1. 修改A、B的EJB模块pom.xml:
    • 移除对方EJB的依赖,添加common-api依赖
    • 各自的EJB实现类实现common-api中的对应接口,例如:
      @Remote(MyAService.class)
      public class MyAServiceImpl implements MyAService {
          // 业务实现
      }
      
  2. 跨项目调用时,通过JNDI查找接口实例:
@Inject
private Context context;

public void callBService() {
    MyBService bService = (MyBService) context.lookup(
        "ejb:/B-ear/B-ejb/MyBServiceImpl!" + MyBService.class.getName()
    );
    bService.execute();
}

方案2:动态JNDI查找替代编译时依赖

无需调整模块结构,直接移除双方的ejb-client依赖,通过完整JNDI路径动态查找EJB:

  1. 从A、B的EJB模块pom.xml中删除对方的依赖项
  2. 调用方通过JNDI直接查找目标EJB,注意需在本地定义与目标一致的接口(避免代码重复,仍建议配合公共接口使用):
InitialContext ctx = new InitialContext();
MyBService bService = (MyBService) ctx.lookup(
    "ejb:/B-ear/B-ejb/MyBServiceImpl!" + MyBService.class.getName()
);

缺点:编译期无类型校验,易因接口变更引发运行时错误。

方案3:将公共依赖部署为WildFly全局模块

把共享接口打包为独立JAR,部署到WildFly Domain的全局模块中,让A、B通过模块依赖引用:

  1. 打包公共接口为common-ejb-api.jar
  2. 在WildFly Domain的modules目录下创建com/example/common/main,放入JAR并编写module.xml:
<?xml version="1.0" encoding="UTF-8"?>
<module xmlns="urn:jboss:module:1.9" name="com.example.common">
    <resources>
        <resource-root path="common-ejb-api.jar"/>
    </resources>
    <dependencies>
        <module name="jakarta.ejb.api"/>
        <module name="jakarta.annotation.api"/>
    </dependencies>
</module>
  1. 在A、B的EJB模块中添加jboss-deployment-structure.xml,声明模块依赖:
<jboss-deployment-structure>
    <deployment>
        <dependencies>
            <module name="com.example.common" export="true"/>
        </dependencies>
    </deployment>
</jboss-deployment-structure>
  1. 修改A、B的pom.xml,添加provided范围的公共模块依赖:
<dependency>
    <groupId>com.example</groupId>
    <artifactId>common-ejb-api</artifactId>
    <version>1.0.0</version>
    <scope>provided</scope>
</dependency>

缺点:需手动维护WildFly模块,部署复杂度较高。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 12:44:51