【问题标题】:ClassLoader.getSystemResource() does not work in OSGI BundleClassLoader.getSystemResource() 在 OSGI Bundle 中不起作用
【发布时间】:2015-12-30 09:19:38
【问题描述】:

我有一个现有的 jar,我现在已将其转换为 OSGI Bundle。

问题是现在(作为 OSGI Bundle),它不能加载资源。 我正在使用ClassLoader.getSystemResource() 方法,它返回null

使用代码:

java.net.URL jdbc = ClassLoader.getSystemResource("com/company/cfg/provider/JDBC.xml");

我无权访问源代码,所以请通过更改配置(清单文件或其他内容)以使其正常工作。

Bundle.getResource() 有效,但我无法更改源代码。

【问题讨论】:

  • 没有这种方法。 getSystemResource() 顾名思义。这就是为什么它的名字不是getResourceFromAMagicallyDeterminedClassLoader()
  • @Holger :我不是 OSGI 专家。 getSystemResource() 适用于非 osgi 应用程序。
  • 这与 OSGi 无关。 getSystemResource() 适用于as its documentation states 可通过系统类加载器(这是加载普通独立应用程序的类加载器)访问的资源。它不适用于其他类加载器。 OSGi 的全部意义在于拥有 bundles 而不是一个全局应用程序类加载器。因此,如果您的代码依赖于 getSystemResource(),则它与 OSGi 不兼容。或任何其他重要的应用程序结构。

标签: java osgi classloader osgi-bundle


【解决方案1】:

原因是 OSGi 包使用它自己的类加载器。所以你要做的是获得 OSGi 类加载器:

    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");

调用静态ClassLoadergetClass().getClassLoader() 之间的区别在于,在第一种情况下,您会得到一个无法正确处理OSGi 捆绑包的java.lang.ClassLoader 实例,而第二次调用将得到一个ClassLoader,即用于加载作为 OSGi 包一部分的当前类。

【讨论】:

  • 这没有意义。通过实例调用 static 方法不会以任何方式更改调用。
  • @Holger 你是对的,我也为这种情况添加了一个示例。
  • 什么情况? getSystemResource 是一个 static 方法。无论您在调用之前添加什么都无关紧要,结果仍然与在问题中调用 ClassLoader.getSystemResource 相同。
  • 但是,当使用 getResource 而不是 getSystemResource 时,应该会有所不同。
  • 是的。不更改源代码(实际上是修复源代码,因为它明显坏了)你无法解决这个问题。
猜你喜欢
  • 2012-04-17
  • 2011-09-21
  • 2015-07-20
  • 1970-01-01
  • 1970-01-01
  • 2011-06-18
  • 1970-01-01
  • 2018-10-01
  • 1970-01-01
相关资源
最近更新 更多