【问题标题】:adding resource files to karaf classpath将资源文件添加到 karaf 类路径
【发布时间】:2018-03-29 18:40:09
【问题描述】:

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

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

  1. 加载文件的代码似乎试图仅从 Bundle Classloader 加载资源,并且
  2. 它调用“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


    【解决方案1】:

    我得到了一个客户端 jar,我用它来调用服务器端的类和方法(包含我无法更新的代码)。所需的属性文件存在于提供的客户端 jar 中,但它们的代码仍然无法找到并加载它们。

    如果此客户端 jar 作为 OSGi 包运行,那么当(且仅当)资源位于包的类路径上时,它应该能够使用自己的类加载器(包类加载器)找到资源。

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

    • 一种可能是客户端捆绑包设置了不同的类路径,而属性文件不在其中。
    • 另一种可能性是属性文件位于类路径中,但位置与预期不匹配,例如代码正在寻找foo.properties,文件位于`/props/foo.properties'

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

    getResourceAsStream() 只是 getResource().openStream() 的 null 安全版本。

    我还有哪些其他选项可以让 Bundle Classloader 找到这些文件?

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

    【讨论】:

    • 添加了作为我原始帖子更新的解决方案。按照建议设置 ContextClassLoader 就可以了!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-02
    • 2021-12-29
    • 1970-01-01
    • 2015-08-01
    相关资源
    最近更新 更多