ClassLoader.getSystemResource()在OSGI Bundle中不起作用

时间:2015-10-02 07:35:53

标签: java osgi classloader osgi-bundle

我有一个现有的jar,我现在已经转换为OSGI Bundle。

问题是现在(作为OSGI Bundle),它无法加载资源。 我使用的是ClassLoader.getSystemResource()方法,它会返回null

使用过的代码:

java.net.URL jdbc = ClassLoader.getSystemResource("com/company/cfg/provider/JDBC.xml");

我无法访问源代码,因此请通过更改配置(清单文件或其他内容)来告知某些方法,以使其正常工作。

Bundle.getResource()有效,但我无法更改源代码。

1 个答案:

答案 0 :(得分:1)

原因是OSGi捆绑包使用了它自己的ClassLoader。所以你要做的就是掌握OSGi ClassLoader:

    java.net.URL jdbc = getClass().getClassLoader()
                                  .getResource("com/company/cfg/provider/JDBC.xml");

或者,如果调用发生在类MyClass中的静态上下文中:

java.net.URL jdbc = MyClass.class.getClassLoader()
                              .getResource("com/company/cfg/provider/JDBC.xml");

调用静态ClassLoadergetClass().getClassLoader()之间的区别在于,在第一种情况下,您获得的java.lang.ClassLoader实例无法正确处理OSGi包,第二次调用将获得一个ClassLoader,用于加载当前类,它是OSGi包的一部分。