JDK 17下WebSphere Liberty BASE远程EJB调用失败求助
问题描述
在两个独立VM部署的JavaEE应用间发起远程EJB调用时,主应用发起远程EJB查找后,服务器控制台抛出如下错误堆栈:
[err] Exception in thread "Yoko:ThreadPerRequest:Dispatcher" [err] java.lang.NoClassDefFoundError: Could not initialize class org.apache.yoko.orb.OB.SendingContextRuntimes [err] at org.apache.yoko.orb.OB.CollocatedServer.send(CollocatedServer.java:231) [err] at org.apache.yoko.orb.OB.CollocatedServer.sendReceive(CollocatedServer.java:295) [err] at org.apache.yoko.orb.OB.CollocatedClient.sendReceive(CollocatedClient.java:144) [err] at org.apache.yoko.orb.OB.Downcall.request(Downcall.java:300) [err] at org.apache.yoko.orb.OB.DowncallStub.invoke(DowncallStub.java:615) [err] at org.apache.yoko.orb.CORBA.Delegate.invoke(Delegate.java:403) [err] at org.apache.yoko.orb.CORBA.Delegate.is_a(Delegate.java:252) [err] at org.omg.CORBA.portable.ObjectImpl._is_a(ObjectImpl.java:54) [err] at org.omg.CosNaming.NamingContextHelper.narrow(NamingContextHelper.java:68) [err] at org.apache.yoko.orb.CosNaming.tnaming2.NamingContextImpl$POAServant.resolveObject(NamingContextImpl.java:291) [err] at org.apache.yoko.orb.CosNaming.tnaming2.NamingContextBase.resolveContext(NamingContextBase.java:567) [err] at org.apache.yoko.orb.CosNaming.tnaming2.NamingContextBase.resolve(NamingContextBase.java:266) [err] at org.omg.CosNaming.NamingContextExtPOA._invoke(NamingContextExtPOA.java:366) [err] at org.apache.yoko.orb.OBPortableServer.ServantDispatcher.dispatch(ServantDispatcher.java:189) [err] at org.apache.yoko.orb.OBPortableServer.POA_impl._OB_dispatch(POA_impl.java:1245) [err] at org.apache.yoko.orb.OB.DispatchRequest_impl.invoke(DispatchRequest_impl.java:56) [err] at org.apache.yoko.orb.OB.DispatchThreadPerRequest_impl$Dispatcher.run(DispatchStrategyFactory_impl.java:70) [err] Caused by: java.lang.ExceptionInInitializerError: Exception java.lang.ExceptionInInitializerError [in thread "Default Executor-thread-19"] [err] at org.apache.yoko.rmi.impl.TypeRepository.get(TypeRepository.java:260) [err] at org.apache.yoko.rmi.impl.ValueHandlerImpl.<init>(ValueHandlerImpl.java:62) [err] at org.apache.yoko.rmi.impl.ValueHandlerImpl.<init>(ValueHandlerImpl.java:52) [err] at org.apache.yoko.rmi.impl.ValueHandlerImpl$HandlerHolder.<clinit>(ValueHandlerImpl.java:67) [err] at org.apache.yoko.rmi.impl.ValueHandlerImpl.get(ValueHandlerImpl.java:73) [err] at org.apache.yoko.rmi.impl.UtilImpl.createValueHandler(UtilImpl.java:460) [err] at javax.rmi.CORBA.Util.createValueHandler(Util.java:63) [err] at org.apache.yoko.orb.OB.SendingContextRuntimes.<clinit>(SendingContextRuntimes.java:30) [err] at org.apache.yoko.orb.OB.CollocatedServer.send(CollocatedServer.java:231) [err] at org.apache.yoko.orb.OB.CollocatedServer.sendReceive(CollocatedServer.java:295) [err] at org.apache.yoko.orb.OB.CollocatedClient.sendReceive(CollocatedClient.java:144) [err] at org.apache.yoko.orb.OB.Downcall.request(Downcall.java:300) [err] at org.apache.yoko.orb.OB.DowncallStub.invoke(DowncallStub.java:615) [err] at org.apache.yoko.orb.CORBA.Delegate.invoke(Delegate.java:403) [err] at org.omg.CORBA.portable.ObjectImpl._invoke(ObjectImpl.java:81) [err] at com.ibm.ws.threading.internal.PolicyTaskFutureImpl.run(PolicyTaskFutureImpl.java:762) [err] at com.ibm.ws.threading.internal.PolicyExecutorImpl.runTask(PolicyExecutorImpl.java:1172) [err] at com.ibm.ws.threading.internal.PolicyExecutorImpl$GlobalPoolTask.run(PolicyExecutorImpl.java:198) [err] at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) [err] at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) [err] at java.base/java.lang.Thread.run(Thread.java:833)
注:两个JavaEE应用均部署在JDK 17环境中,远程EJB查找代码如下:
Context ctx = new InitialContext(jndiProps); Object remoteObj = ctx.lookup("corbaname:iiop:10.0.0.127:2809/NameService#ejb/global/app_server_2/RMS.jar/OMSCoreServicesBean#com.dfn.oms.newgen.core.tx.service.OMSCoreServicesWrapperRemote"); return (OMSCoreServicesWrapperRemote) PortableRemoteObject.narrow(remoteObj, OMSCoreServicesWrapperRemote.class);
解决方案
- 确保Yoko ORB依赖完整一致:错误根源是
org.apache.yoko.orb.OB.SendingContextRuntimes类初始化失败,需检查两个应用的类路径,确认包含完整的Yoko ORB核心依赖包(如yoko-orb-core、yoko-rmi-impl等),且两端依赖版本完全一致,避免缺失或版本冲突。 - 验证Yoko与JDK 17的兼容性:部分旧版Yoko ORB对JDK 17支持不足,需升级到官方标注支持JDK 17的Yoko稳定版本。
- 调整线程上下文类加载器:在发起EJB查找前,显式设置线程上下文类加载器为当前应用的类加载器,避免跨线程类加载异常:
Thread.currentThread().setContextClassLoader(getClass().getClassLoader()); - 检查JNDI配置准确性:确认客户端JNDI属性(如
java.naming.factory.initial、java.naming.provider.url)配置正确,确保能正常连接到远程服务器的Naming Service,避免因连接问题触发内部类加载错误。 - 排除CORBA实现冲突:若应用中存在其他CORBA/ORB实现(如Sun ORB、JacORB),需排除这些冲突依赖,确保仅使用Yoko ORB作为CORBA提供者,避免不同实现的类相互干扰。
内容的提问来源于stack exchange,提问作者Rangana Jayawardhena
相关产品推荐
相关产品推荐

