我有一个现有的jar,我现在已经转换为OSGI Bundle。
问题是现在(作为OSGI Bundle),它无法加载资源。
我使用的是ClassLoader.getSystemResource()
方法,它会返回null
。
使用过的代码:
java.net.URL jdbc = ClassLoader.getSystemResource("com/company/cfg/provider/JDBC.xml");
我无法访问源代码,因此请通过更改配置(清单文件或其他内容)来告知某些方法,以使其正常工作。
Bundle.getResource()有效,但我无法更改源代码。
答案 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");
调用静态ClassLoader
和getClass().getClassLoader()
之间的区别在于,在第一种情况下,您获得的java.lang.ClassLoader
实例无法正确处理OSGi包,第二次调用将获得一个ClassLoader
,用于加载当前类,它是OSGi包的一部分。