的OSGI Enterprise Release 5 specification的第126章提到的兼容性:OSGI JNDI是否允许与来自非OSGI代码的JNDI调用共存?
“支持的Java SE和Java EE客户端使用传统的JNDI编程模型。”
和使用OSGI-不知道代码:
“那不知道的OSGi的客户端和JNDI上下文提供使用静态方法来连接到 JRE JNDI实现InitialContext类提供了一个访问。从供应商和 提供商上下文中使用静态NamingManager方法来做对象转换并找到URL上下文。 这种传统的模式是不知道的OSGi的,因此如果 这种缺乏OSGi的意识造成的后果进行管理才能可靠地使用。 “
但如果本文仅适用于“传统”代码OSGi包内执行,或者也OSGi容器外部的代码,目前尚不清楚对我来说,在一个场景中˚F前在OSGi容器嵌入一个应用程序。
在嵌入的情况下,可能有两外侧以及执行JNDI呼叫的OSGI容器内的应用程序代码,并且当它们在相同的JVM执行它们将共享JNDI实现。
问题:应该在嵌入式OSGI容器中的OSGI JNDI实现运行允许在容器外OSGI-不知道代码来执行它的JNDI调用像往常一样,或者说是“OSGI意识”需要做一些移植?
使用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)
问:这是正确的行为,或者是有规范我可以引用的部分由这种限制违反了?