【问题标题】:Can't instantiate class from installed extension when run via OSGI通过 OSGI 运行时无法从已安装的扩展中实例化类
【发布时间】:2012-05-07 10:53:19
【问题描述】:

所以,我有一个已安装的扩展程序(请参阅http://docs.oracle.com/javase/tutorial/ext/basics/index.html),我可以在 Eclipse 中看到它。

我编写了一个简单的 rcp 应用程序,它试图在这个扩展中创建一个类的实例。但是,尽管一切都可以编译,但在创建实例时我得到了 NoClassDefFoundError。

我假设这与 OSGi 有关,因为我可以运行一个简单的 java 应用程序来很好地创建实例。

任何建议都将不胜感激。

谢谢

【问题讨论】:

  • 您是否看到清单的导入列表中加载了类包?
  • 不,它不存在。我的印象是,因为它是一个安装的扩展,它被认为是标准 jre 的一部分,因此有一个隐含的导入。
  • 不,正如@earcam 解释的那样,不幸的是它需要明确。或者,您可以使用一些插件启用自动导入(这基本上会将您的最终工件与您的所有参考资料一起打包)。然而,那些往往会让你的东西变得更加肥胖,以至于他们需要成为这样的人。完全取决于你。无论哪种方式,您都需要确保明确声明您的引用。

标签: java osgi classloader noclassdeffounderror


【解决方案1】:

我找到了另一种解决方案,即使用 arg 将父类加载器设置为“ext”类加载器

osgi.parentClassloader=ext

除了我现在没有得到错误之外,还不确定这种更改的含义。

【讨论】:

  • +1 有趣,不知道这个 - 你应该接受你自己的答案。
【解决方案2】:

由于您的扩展类是由 JRE 提供的,它们需要由 OSGi 框架的系统包导出。

这可以通过将包添加到org.osgi.framework.system.packages.extra 属性来实现(您可以将其设置为系统属性,它将被传递到框架中)。

完成此操作并且您的消费包具有在其 MANIFEST.MF 的 Import-Package 条目中列出的那些包,您应该能够访问这些类。

JRE 扩展几乎是 OSGi 的对立面 - 我很想知道您为什么要这样做?

【讨论】:

  • 原因是我们已经离开了 sun 的 jre,不幸的是,我们有一些依赖于 sun.org.mozilla.javascript.internal 的代码,这些代码位于 rt.jar 中,但是已移至此新 jre 的 ext 目录中。感谢您的解决方案。我已经将 system.bundle 添加为必需的包,并将 sun.org.mozilla.javascript.internal 添加为导入的包,但是 eclipse 告诉我没有包导出包。我已经在启动配置中设置了该属性,但我假设我需要在其他地方设置该属性,以便在编译时也可以使用它。
猜你喜欢
  • 2012-09-12
  • 1970-01-01
  • 1970-01-01
  • 2011-06-19
  • 2016-07-02
  • 1970-01-01
  • 2021-02-19
  • 2013-12-12
  • 1970-01-01
相关资源
最近更新 更多