当前位置: 首页 > 知识库问答 >
问题:

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

荆乐
2023-03-14

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

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

  1. 用于加载文件的代码似乎仅尝试从捆绑类加载器加载资源,并且
  2. 它调用“获取资源()”方法,而不是“获取资源AsStream()”方法。

或者,我尝试将资源添加到文件系统上的目录中,并将类路径附加到目录的位置,如下所示:

"-cp.; C:/用户/abcUser/桌面/资源文件夹/;"

(windows 7,在eclipse中使用junit 4执行pax考试时,类路径条目作为VM参数添加)

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

更新:在接受答案的以下部分之后,应用程序成功加载了属性文件。

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

来自客户机jar的代码与猜测的完全一样:使用< code>Thread.currentThread()加载资源。getContextClassLoader()。我能够将< code>ContextLoader设置为< code > 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);
}

共有1个答案

萧伟兆
2023-03-14

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

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

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

  • 一种可能性是客户机捆绑包具有不同的类路径集,并且属性文件不在其上。
  • 另一种可能性是属性文件位于类路径上,但位置与预期不匹配,例如,代码正在寻找 foo.properties,而文件位于“/props/foo.properties”。

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

getResourceAsStream() 只是一个空安全版本的 getResource().openStream().

我还有哪些其他选项可以让捆绑类装入器找到这些文件?

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

 类似资料:
  • 问题内容: 在开发Java项目时,我将所有jar文件都放在一个在项目内部创建的文件夹中,称为Now,是否可以将文件夹添加到Java类路径中,而不必添加每个jar文件? 我在考虑变量或创建用户库的思路。 问题答案: 根据您所说的,我可能会创建一个包含您的库JAR的用户库。 您可以使用Window => Preferences创建一个用户库,向下钻取到Java => Build Path => Use

  • 问题内容: 如何在netbeans项目的类路径中添加文件夹(例如,包含arts的资源文件夹)?我设法通过编辑项目的NB生成的jar文件(即其MANIFEST.MF文件+手动复制资源)来手动完成此操作,但是应该有一种方法可以告诉netbeans并注意资源,不是吗? 文件夹结构如下所示: 我不想将艺术品包装到罐子里,因为我希望艺术品可以轻松更换。如果我将art文件夹添加到src文件夹,则NB可以正常编

  • 问题内容: 我在上,我尝试了下都无济于事。还尝试将jar移到src目录,但是java文件仍然无法编译。尝试在脚本中简单地导入httpclient。 问题答案: 安装您的JDK并将 其放置 。难道 不是 .jar文件复制到你的JDK的文件夹! 如果您还没有一个IDE,我建议您使用Eclipse或Netbeans这样的IDE。 我将建立一个新项目,创建或导入您的源,并为该项目设置一个类路径。 如果那行

  • 问题内容: 我正在使用“运行”->“运行”菜单从IntelliJ IDE运行一个简单的Java程序。它工作正常。现在,我想添加log4j日志记录。 我在项目根目录下添加了一个资源文件夹。我在该文件夹中添加了一个log4j.properties文件。我更改了代码以记录某些内容。 告诉IntelliJ在类路径中包含资源文件夹以便可以看到属性文件的正确方法是什么? 使用IntelliJ 8,我可以像喝醉

  • 这个问题与我的另一个问题类似,但这次是针对Microsoft Azure的。 我们有一个配置文件需要在驱动程序(可能还有执行程序)的类路径中。 在Microsoft Azure中定义数据库群集时,我配置了自定义Spark配置:spark.executor.extraClassPath和spark.driver.extraClassPath。我将两个路径指向dbfs中包含我们配置的目录。但正如一半人

  • 我有一个包,它使用一个配置文件具有一个属性: 我使用ConfigAdmin的蓝图如下所示: 只要我可以更改属性的值并且包自动更新属性,这就很好。 我想知道是否有任何方法可以在不更改蓝图的情况下将新属性添加到我的配置文件中(这涉及再次编译/打包)。当然,我的包应该准备好处理新属性。 不确定这在OSGi是否有意义。谁能给我一点提示,告诉我如何向现有配置文件动态添加新属性,并使它们在ConfigAdmi