mik*_*wse 14 java osgi jndi apache-karaf aries
OSGI企业版第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)
Run Code Online (Sandbox Code Playgroud)
问题:这是正确的行为,还是我可以参考的规范中有一部分违反了此限制?
我不确定我是否正确理解了这个问题... JNDI 是一个服务提供者接口,它需要一些底层实现来运行。您所需要做的就是为其配置 OSGI 容器。
我建议使用 JNDI 所需的所有 jar 创建单个包并导出所有包。然后使用 Dynamic-Import: * 来使用它。它在我们的案例中发挥了作用(带有用于 EJB 调用的 JBoss 5 JNDI 的 Eclipse RCP 应用程序)。
但是,如果您需要在容器内部和外部使用 JNDI,并且您不想为类加载而烦恼,我建议将所有 jar 添加到应用程序类路径中。这样它应该可以在整个应用程序中访问。
归档时间: |
|
查看次数: |
2559 次 |
最近记录: |