【问题标题】:JNDI lookup from OSGI equinox bundle deployed on tomcat (bridged mode)从部署在 tomcat 上的 OSGI Equinox 包进行 JNDI 查找(桥接模式)
【发布时间】:2026-02-06 19:45:01
【问题描述】:

我在 tomcat\context.xml 中配置了我的数据源。我已经部署了一个Eclipse提供的bridge.war来获取servletbridge环境。

我已经开发了另一个包含 servlet 注册代码的 osgi 包,我的目标是让 JNDI 从这个 servlet 包中查找数据源。

但是我得到了

javax.naming.NoInitialContextException:Cannot instantiate class: org.apache.naming.java.javaURLContextFactory (root cause classnotfound for org.apache.naming.java.javaURLContextFactory)

当我尝试在我的 OSGI 包中使用以下代码时

        Context initContext = new InitialContext();
        Context envContext = (Context) initContext.lookup("java:/comp/env");
        DataSource ds = (DataSource) envContext.lookup("jdbc/TestDB");

我在我的 osgi 容器中添加了 catalina.jar 并且也作为我的 osgi 包中的依赖项。

bridge.war 的 launch.ini 如下所示:

osgi.*=@null
org.osgi.*=@null
eclipse.*=@null

osgi.parentClassloader=ext
osgi.contextClassLoaderParent=ext
org.osgi.framework.system.packages.extra=org.apache.naming.java

有人可以帮我吗?

【问题讨论】:

  • 尝试在war中将org.osgi.framework.system.packages.extra=org.apache.naming.java添加到launch.ini中。我从未尝试过这座桥,但对战争有过一分钟的了解,我认为这将解决您的问题。如果是的话,我会从评论中回答。
  • 不行。我试过之后仍然遇到同样的问题。你建议添加任何其他 jar 吗?
  • 这个可能是相关的:wiki.eclipse.org/…。父类加载器是不包含所需包的 ext。您可以尝试使用其他类加载器,如 app 或 fwk。他们说:“这通常也是一个坏主意”,但是,我认为您无法访问 Tomcat 的 JNDI。再次请注意,这只是一个提示,不是我自己尝试的解决方案。
  • 当我将类加载器更改为 fwk 时它工作了。非常感谢!!
  • 我从中做出了回答。

标签: tomcat servlets osgi equinox embedded-osgi


【解决方案1】:

嵌入式 OSGi 容器的父级是 ext:Java 扩展类加载器

为了能够看到 Tomcat 的类,必须将 launch.ini 中的父类加载器更改为 fwk:OSGi 框架类加载器。

通过这样做,嵌入式 OSGi 容器的父类加载器成为 Web 应用程序的类加载器。如果嵌入式 OSGi 容器中的包想要直接使用 webapp 或 Tomcat 中的类,您可能必须使用 org.osgi.system.packages.extra 设置列出该类的包。

关于嵌入式 Equinox 的父类加载器的更多信息:http://wiki.eclipse.org/FAQ_How_do_I_add_a_library_to_the_classpath_of_a_plug-in%3F

更多关于Tomcat类加载器层次结构的信息:http://tomcat.apache.org/tomcat-6.0-doc/class-loader-howto.html

【讨论】:

  • 嗨,我阅读了您提供的链接,但无法了解“fwk”究竟是如何工作的?我的意思是根据链接,它的类路径没有严格指定。你能帮我理解吗?
  • 如果你使用'ext',你的OSGi框架的父类加载器将是看不到JNDI实现的JDK的ext类加载器。如果你使用'fwk',父类加载器系统包的父类加载器将是webapp的类加载器。所有不是来自捆绑包(例如 JNDI API)的包都来自系统捆绑包。即使系统包没有导出它的包,系统包也会看到 JNDI Tomcat impl。
  • 我把我的改成 ccl 并且它有效.. 你能解释一下吗?
  • ccl 表示:“ccl - 框架启动时设置的原始上下文类加载器”。在你的情况下,我猜OSGi容器启动时使用的线程上下文类加载器是类加载器是webapp的类加载器,所以它也可以工作。
最近更新 更多