【发布时间】:2018-03-29 18:40:09
【问题描述】:
我正在使用 karaf 4.0.5 和 osgi 进行项目。我们有客户端代码来调用 REST API,这需要加载 3 个“*.properties”文件。我得到了一个客户端 jar,我用它来调用服务器端的类和方法(包含我无法更新的代码)。所需的属性文件存在于提供的客户端 jar 中,但它们的代码仍然无法找到并加载它们。
在调试我的 pax 考试时,我发现它没有从 jar 加载资源文件的可能原因如下。
- 加载文件的代码似乎试图仅从 Bundle Classloader 加载资源,并且
- 它调用“
getResource()”方法而不是“getResourceAsStream()”方法。
或者,我尝试将资源添加到我的文件系统上的目录中,并在类路径中附加目录的位置,如下所示:
“-cp .;C:/Users/abcUser/Desktop/resourceFolder/;”
(windows 7,在使用 eclipse 中的 junit 4+ 执行 pax 检查时添加了类路径条目作为 VM 参数)-> 这也不起作用,它仍然无法找到这些文件。 我还有哪些其他选项可以让 Bundle Classloader 找到这些文件?
注意:我们已经有一堆其他 *.cfg 文件,它们的内容使用蓝图加载到 bean 中并在容器中注册,但这不是我需要在这里做的。在运行时,这些文件应该可供 BundleClassloader 使用,并且应该由“getResource()”方法检索。
更新:在接受答案的以下部分之后,应用程序已成功加载属性文件。
要检查的另一件事是客户端代码在尝试加载这些资源时是否实际使用了捆绑类加载器。在某些情况下,代码试图通过使用线程上下文类加载器来变得聪明,这需要在调用客户端代码之前进行适当的设置。
客户端 jar 中的代码与猜测的完全一样:资源加载是使用 Thread.currentThread().getContextClassLoader() 进行的。我能够将ContextLoader 设置为CustomAbstractProcessor 的类加载器,它现在从该包的类路径加载属性文件!
ClassLoader previousCL = Thread.currentThread().getContextClassLoader();
Thread.currentThread().setContextClassLoader(CustomAbstractProcessor.class.getClassLoader());
try {
//REST call to server using classes and methods from provided client jar.
}
finally {
Thread.currentThread().setContextClassLoader(previousCL);
}
【问题讨论】:
标签: java osgi classpath apache-karaf blueprint-osgi