gpt4 book ai didi

java - OSGI JNDI 是否允许与来自非 OSGI 代码的 JNDI 调用共存?

转载 作者:搜寻专家 更新时间:2023-10-30 19:47:28 26 4
gpt4 key购买 nike

第126章OSGI Enterprise Release 5 specification提到兼容性:

"Support the traditional JNDI programming model used by Java SE and Java EE clients."

和使用 OSGI 不感知代码:

"Clients and JNDI Context providers that are unaware of OSGi use static methods to connect to the JRE JNDI implementation. The InitialContext class provides access to a Context from a provider and providers use the static NamingManager methods to do object conversion and find URL Contexts. This traditional model is not aware of OSGi and can therefore only be used reliably if the consequences of this lack of OSGi awareness are managed."

但我不清楚这篇文章是否仅适用于在 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 需要 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)

问题:这是正确的行为,还是我可以引用的规范中有一部分违反了此限制?

最佳答案

我在尝试在 Weblogic 上部署 Apache Karaf 时遇到了同样的问题。我们通过 servlet 桥使用 karaf - 在 weblogic 中部署了一个 war,它将所有 http 请求桥接到 karaf。

我在 weblogic 上运行以下应用程序:

  1. app1(使用 JNDI)
  2. 应用2
  3. karaf-bridge(将请求桥接到 Karaf)

一旦 karaf 启动,在 Karaf 中运行的 Aries JNDI 实现就会将 javax.naming.NamingManager 中的 InitialContextFactoryBuilder 设置为其自己的实现。 NamingManager 持有对初始上下文工厂构建器的静态引用,因此无论哪个实现,无论其是否在 OSGI 环境中运行,设置此静态引用都将成为 JNDI 提供者。

在我的例子中,当 app1(非 OSGI)尝试创建一个新的 InitialContext 时,Aries JNDI 尝试使用 BundleContext 解析它但失败了。

我使用了一些非常丑陋的 hack 来解决这个问题,这些 hack 涉及从 jre 中提取 javax.naming 包并将其作为一个包安装在 karaf 中。

所以你的问题的答案是:我认为问题确实出在 jre 而不是 OSGI 关于如何管理 JNDI 查找的问题。

关于java - OSGI JNDI 是否允许与来自非 OSGI 代码的 JNDI 调用共存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13682882/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com