NetBeans+Payara 6远程会话Bean部署冲突及接口放置问题求助
解决方案:Payara 6中EJB远程调用的部署冲突问题
核心问题定位
你遇到的问题本质是依赖包中包含了EJB实现类,导致Payara在部署BeanA时重复扫描并注册了BeanB,和独立EAR中的BeanB产生JNDI名称冲突。即使只保留远程接口,若依赖配置不当或Payara扫描规则没调整,也会引发问题。以下是具体解决步骤:
1. 拆分项目为三层结构(彻底隔离依赖)
把项目拆成三个独立模块,避免实现类混入调用方的部署包:
- 远程接口模块(纯JAR):仅存放
RemoteBeanB.java接口,无任何实现代码。 - BeanB实现模块(EJB JAR):依赖远程接口模块,实现
RemoteBeanB接口,标注@Remote注解。 - BeanA模块(WAR/EAR/客户端JAR):仅依赖远程接口模块,不引入任何BeanB的实现类。
2. 配置依赖范围(关键)
在NetBeans中,给BeanA对远程接口模块的依赖设置Provided范围(Maven对应<scope>provided</scope>,Gradle对应compileOnly):
- 这样编译时能正常识别接口,部署时不会把接口模块的JAR打包进BeanA的部署包,从根源避免Payara扫描到多余的EJB类。
3. 显式指定BeanB的JNDI名称
在BeanB的实现类上,通过@Remote注解显式声明唯一的JNDI路径,避免Payara生成默认名称导致冲突:
import javax.ejb.Remote; import javax.ejb.Stateless; @Stateless @Remote(jndiName = "java:global/BeanBEAR/BeanB/RemoteBeanB") public class BeanB implements RemoteBeanB { // 业务方法实现 }
4. 在BeanA中通过JNDI查找注入BeanB
不要依赖@EJB的自动匹配,而是显式指定BeanB的JNDI名称进行注入:
import javax.ejb.EJB; public class BeanA { @EJB(lookup = "java:global/BeanBEAR/BeanB/RemoteBeanB") private RemoteBeanB beanB; // 调用beanB的业务方法 }
5. 清理部署缓存
- 删除Payara域下
domains/domain1/applications目录中的所有旧部署文件。 - 清理NetBeans项目的
target目录,重新构建并部署BeanB的EAR和BeanA的模块。
6. 调整Payara的EJB扫描规则
如果上述步骤仍有问题,进入Payara管理控制台:
- 导航到
Configurations > server-config > EJB Container。 - 关闭
Scan Libraries for EJBs选项,阻止Payara扫描依赖库中的EJB实现类。
内容的提问来源于stack exchange,提问作者JanNilsson
相关产品推荐
相关产品推荐

