2

我在 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

有人可以帮我吗?

4

1 回答 1

2

嵌入式 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

于 2014-07-25T08:43:05.740 回答