【发布时间】:2012-11-20 21:31:46
【问题描述】:
OSGI Enterprise Release 5 specification 的第 126 章提到了兼容性:
“支持 Java SE 和 Java EE 客户端使用的传统 JNDI 编程模型。”
以及使用不支持 OSGI 的代码:
“不知道 OSGi 的客户端和 JNDI 上下文提供程序使用静态方法连接到 JRE JNDI 实现。 InitialContext 类提供从提供者对 Context 的访问,并且 提供者使用静态 NamingManager 方法进行对象转换和查找 URL 上下文。 这种传统模型不了解 OSGi,因此只有在出现后果的情况下才能可靠地使用 对这种缺乏 OSGi 意识的情况进行了管理。”
但我不清楚此文本是否仅适用于在 OSGI 包内执行的“遗留”代码,或者也适用于 OSGI 容器外部的代码,例如在 OSGI 容器嵌入应用程序的情况下。
在嵌入场景中,OSGI 容器外部和内部都可能存在执行 JNDI 调用的应用程序代码,并且当它们在同一个 JVM 中执行时,它们将共享 JNDI 实现。
问题:在嵌入式 OSGI 容器中运行的 OSGI JNDI 实现是否应该允许容器外部的不支持 OSGI 的代码像往常一样执行其 JNDI 调用,或者是否需要移植到“OSGI 感知”? ?
我自己用 Apache Karaf 2.3.0(它使用 Apache Aries JNDI 1.0.0)尝试这个似乎不起作用,因为 Apache Aries 需要来自 OSGI 包的 JNDI 客户端调用。
部分堆栈跟踪:
javax.naming.NoInitialContextException: The calling code's BundleContext could not be determined.
at org.apache.aries.jndi.OSGiInitialContextFactoryBuilder.getInitialContext(OSGiInitialContextFactoryBuilder.java:46)
at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:684)
at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:307)
at javax.naming.InitialContext.init(InitialContext.java:242)
at javax.naming.InitialContext.<init>(InitialContext.java:192)
问题:这是正确的行为,还是我可以参考的规范中的某个部分违反了此限制?
【问题讨论】:
标签: java osgi jndi apache-karaf aries