将资源文件添加到karaf类路径

问题描述:

我正在使用karaf 4.0.5和osgi进行项目工作。我们有客户端代码来调用REST API,它需要加载3个“* .properties”文件。我有一个客户端jar,我用它来调用服务器端类和方法(包含我无法更新的代码)。所需的属性文件存在于提供的客户端jar中,但他们的代码仍然未找到并加载它们。将资源文件添加到karaf类路径

在调试我的pax考试时,我发现下面可能的原因是它没有从jar中加载资源文件。

  1. 代码载入的文件似乎试图仅从捆绑类加载器加载资源,并
  2. 它称之为“getResource()”的方法,而不是“getResourceAsStream()”的方法。

另外,我尝试添加的资源目录我的文件系统上,并附加与目录所在位置的类路径,如:

-cp .;C:/Users/abcUser/Desktop/resourceFolder/;

(Windows 7中,类路径条目在使用eclipse中的junit 4+执行pax考试时添加为VM参数) - >这不起作用,它仍然无法找到这些文件。 我有什么其他选项,所以Bundle Classloader可以找到这些文件?

注意:我们已经有一堆其他* .cfg文件,其内容使用蓝图加载到bean中并注册到容器中,但这不是我在这里需要做的。在运行时期间,这些文件应该可用于BundleClassloader,并且应该由“getResource()”方法检索。

更新:继接受答案的下面部分后,应用程序已成功加载属性文件。

另一件要检查的问题是客户端代码在尝试加载这些资源时是否实际上使用了bundle classloader。在某些情况下,代码试图通过使用线程上下文类加载器来实现聪明,在调用客户端代码之前,需要对其进行适当设置。

来自客户端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); 
} 

我已经给出我使用来调用服务器侧的类和方法(含有的代码,我无法更新)客户端罐子。所需的属性文件存在于提供的客户端jar中,但他们的代码仍然未找到并加载它们。

如果该客户端jar运行作为一个OSGi包,那么它应该能够找到使用自己的类加载器(捆绑类加载器)资源,如果(且仅当)的资源在bundle的类路径。

OSGi包的默认类路径是.,即包的根。这可以使用清单标头Bundle-ClassPath覆盖,并用于捆绑中的一个或多个位置。

  • 一种可能性是客户端软件包具有不同的类路径集,而属性文件不在其上。
  • 另一种可能性是属性文件位于类路径中,但是位置与期望的不符。代码寻找foo.properties和文件是`/props/foo.properties'

它调用getResource()方法,而不是getResourceAsStream()方法。

getResourceAsStream()只是一个无效安全版本getResource().openStream()

我还有其他的选择,所以Bundle Classloader会找到这些文件吗?

要检查的另一件事是,当试图加载这些资源时客户端代码是否实际上使用了bundle classloader。在某些情况下,代码试图通过使用线程上下文类加载器来实现聪明,在调用客户端代码之前,需要对其进行适当设置。

+0

添加了对我的原始文章进行更新的解决方案。按照建议设置'ContextClassLoader'就有诀窍了! –