【发布时间】:2014-06-11 14:22:55
【问题描述】:
通过 JNDI 从 WAS 获取 commonj Workmanager 没什么大不了的,但我的代码在 OSGi 环境中失败(我使用的是 bundleActivator,而不是 aries 蓝图)。
import commonj.work.WorkManager;
InitialContext ic = new InitialContext();
WorkManager wm = (WorkManager)ic.lookup("java:comp/env/wm/myWorkManager");
此代码块在 WAR 中运行良好。但是,如果我将它添加到我的本机 OSGi 包中,它会因 ClassCastException 而失败。
检查我的对象,它告诉我 workManager 是 com.ibm.ws.asynchbeans.WorkManagerImpl 的一个实例。
在 IBM 的 WorkManager 和 CommonJ WorkManager 之间创建一个自定义委托器应该没什么大不了的,但由于我的研究,我既找不到 IBM 的 workManager 的类层次结构,也找不到包含该类的 JAR。
我们使用 Websphere 8.0.0.6。
WorkManager.class.getClassLoader() = org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader@d34707f4
wm.getClass().getClassLoader().loadClass(WorkManager.class.getName()).getClassLoader() = org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader@5d968aee
WorkManager.class.getProtectionDomain().getCodeSource().getLocation() = file:/D:/dev/IBM/WebSphere/AppServer/profiles/AppSrv01/installedEBAs/jndi-workmanager_0.0.1.SNAPSHOT/byValue/c13b7c6c -1881-477c-a339-e0c4f992e35b.0/0/
【问题讨论】:
-
“本机 OSGi 环境”是什么意思?您是否尝试从 WAB 访问课程?您是否在捆绑包中包含了 commonj.work 类? WorkManager.class.getClassLoader() 和 WorkManager.class.getProtectionDomain().getCodeSource().getLocation() 和 ic.lookup(...).getClass().loadClass(WorkManager.class.getName( )).getClassLoader() 有吗?
-
我在我的问题中添加了类加载器信息。对于“本地”,我的意思是我们不使用 Aries 蓝图,jndi-lookup 在 bundleactivator 中被调用。