JBoss EAP 6.4端到端HelloWorld RMI示例无法运行求助
问题解决:EJB远程调用失败
1. 修正JNDI查找名称
服务器日志明确给出了EJB的正确全局JNDI绑定:
java:global/jboss-eap-client/HelloWorldBean!org.example.HelloWorldRemote
但你客户端代码中使用的是java:global/jboss-helloworld/HelloWorldBean!org.example.HelloWorldRemote,两者的部署单元名称(jboss-eap-client vs jboss-helloworld)不匹配——这是因为你的Maven配置里<finalName>jboss-eap-client</finalName>指定了部署后的Jar名称。
修改客户端代码中的JNDI名称:
String jndiName = "java:global/jboss-eap-client/HelloWorldBean!org.example.HelloWorldRemote";
或者直接使用服务器日志里带java:jboss/exported/前缀的专用远程JNDI名称:
String jndiName = "jboss-eap-client/HelloWorldBean!org.example.HelloWorldRemote";
2. 解决依赖冲突
从mvn dependency:tree输出能看到,jboss-remoting存在两个版本:
org.jboss:jboss-remoting:jar:4.0.5.Final(由jboss-ejb-client间接引入)org.jboss.remoting3:jboss-remoting:jar:3.3.12.Final(直接依赖)
版本冲突会导致类加载异常,建议移除直接依赖的org.jboss.remoting3:jboss-remoting,因为jboss-ejb-client已经包含了兼容版本的remoting组件。
修改pom.xml,删除以下依赖段:
<dependency> <groupId>org.jboss.remoting3</groupId> <artifactId>jboss-remoting</artifactId> <version>3.3.12.Final</version> </dependency>
EJB2.x到JBoss EAP 6.4迁移建议
1. EJB2.x实体Bean迁移策略
- 兼容过渡:EAP 6.4完全支持EJB2.x实体Bean,可先保留原有
ejb-jar.xml配置,将JBoss 5的jboss.xml替换为EAP6适配的jboss-ejb3.xml,更新命名空间为http://www.jboss.com/xml/ns/javaee。 - 逐步迁移到JPA:长期建议将EJB2.x实体Bean替换为JPA 2.0实体,通过注解或
persistence.xml配置,逐步替换原有数据访问逻辑,降低技术债务。
2. 配置文件适配
- 检查
ejb-jar.xml的命名空间,升级为Java EE 5或更高版本(EAP6支持Java EE 6规范)。 - 将JBoss 5的特定配置(如数据源、事务绑定)迁移到EAP6的
standalone.xml或domain.xml中,避免依赖旧版部署描述符。
3. 依赖管理
- 移除JBoss 5专属依赖(如
jbossall-client.jar),替换为EAP6.4提供的规范API:org.jboss.spec.javax.ejb:jboss-ejb-api_3.1_spec(EJB 3.1规范)org.jboss.spec.javax.persistence:jboss-jpa-api_2.0_spec(JPA 2.0规范)
- 对服务器已内置的依赖使用
provided范围,避免打包时出现冲突。
4. 远程调用适配
- 替换JBoss 5的远程客户端模型,采用EAP6的
jboss-ejb-client框架:- 可通过代码设置
InitialContext环境变量(如你当前的实现) - 也可通过
jboss-ejb-client.properties文件简化客户端配置
- 可通过代码设置
- 注意端口差异:EAP6默认远程端口为4447,与JBoss5的4444不同。
5. 测试与验证
- 采用模块化迁移,先迁移单个EJB模块,验证远程调用、事务、数据访问等核心功能。
- 使用EAP6管理控制台(http://localhost:9990)查看JNDI绑定、部署状态,快速排查问题。
内容的提问来源于stack exchange,提问作者xnio15
相关产品推荐
相关产品推荐

