OSGI Enterprise Release 5 规范的第 126 章提到了兼容性:
“支持 Java SE 和 Java EE 客户端使用的传统 JNDI 编程模型。”
以及使用不支持 OSGI 的代码:
“不知道 OSGi 的客户端和 JNDI 上下文提供者使用静态方法连接到 JRE JNDI 实现。InitialContext 类提供从提供者对上下文的访问,提供者使用静态 NamingManager 方法进行对象转换和查找 URL 上下文。这个传统模型不知道 OSGi,因此只有在对缺乏 OSGi 意识的后果进行管理的情况下才能可靠地使用。”
但我不清楚此文本是否仅适用于在 OSGI 包内执行的“遗留”代码,或者也适用于 OSGI 容器外部的代码,例如在 OSGI 容器嵌入应用程序的情况下。
在嵌入场景中,OSGI 容器外部和内部都可能存在执行 JNDI 调用的应用程序代码,并且当它们在同一个 JVM 中执行时,它们将共享 JNDI 实现。
问题:在嵌入式 OSGI 容器中运行的 OSGI JNDI 实现是否应该允许容器外的不支持 OSGI 的代码像往常一样执行其 JNDI 调用,或者是否需要移植到“OSGI-awareness”?
我自己用 Apache Karaf 2.3.0(它使用 Apache Aries JNDI 1.0.0)尝试这个似乎不起作用,因为 Apache Aries 要求 JNDI 客户端调用源自 OSGI 包。
部分堆栈跟踪:
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)
问题:这是正确的行为,还是我可以参考的规范中的某个部分违反了此限制?