WildFly 29中EJB双向调用引发Maven循环依赖问题求助
解决WildFly Domain中EJB项目互相调用的Maven循环依赖问题
问题核心
A、B两个项目的EJB模块需要互相调用,导致双方pom.xml都要引入对方的ejb-client依赖,触发Maven循环依赖,构建失败。
可行解决方案
方案1:提取公共API模块(推荐)
将A、B互相调用所需的远程业务接口抽离到独立的公共模块,彻底打破循环依赖:
- 新建
common-api模块,仅存放接口代码,不包含实现类 - 主pom.xml添加该模块:
<modules> <module>common-api</module> <module>A</module> <module>B</module> </modules>
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>
- 修改A、B的EJB模块pom.xml:
- 移除对方EJB的依赖,添加
common-api依赖 - 各自的EJB实现类实现
common-api中的对应接口,例如:@Remote(MyAService.class) public class MyAServiceImpl implements MyAService { // 业务实现 }
- 移除对方EJB的依赖,添加
- 跨项目调用时,通过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:
- 从A、B的EJB模块pom.xml中删除对方的依赖项
- 调用方通过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通过模块依赖引用:
- 打包公共接口为
common-ejb-api.jar - 在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>
- 在A、B的EJB模块中添加
jboss-deployment-structure.xml,声明模块依赖:
<jboss-deployment-structure> <deployment> <dependencies> <module name="com.example.common" export="true"/> </dependencies> </deployment> </jboss-deployment-structure>
- 修改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
相关产品推荐
相关产品推荐

