【问题标题】:Confused with classloading in OSGI对 OSGI 中的类加载感到困惑
【发布时间】:2016-06-24 10:35:11
【问题描述】:

我在一个 RCP 项目中遇到了问题。 我有一个 OSGI jar,可以说 jar-A,它从另一个 osgi jar 导入一些包,可以说 jar-B。现在我又多了一个 osgi jar-C,它的包结构与 jar-A 相同,但里面的类不同。

我有一个名为“plugin-A”的插件,它在其构建路径中同时包含 jar-A 和 jar-B,并作为运行时依赖项。现在 plugin-A 导出 jar-A 和 jar-B 的包。

我还有一个“plugin-B”,它的构建路径中有“jar-C”并作为运行时依赖项。现在 plugin-B 将 plugin-A 作为必需的捆绑包。所以从技术上讲,它应该能够访问“jar-A”和“jar-B 的包,对吧?

现在 plugin-B 有一个类可以从 jar-A 和 jar-C 的类中导入包。它可以很好地识别 jar-C 的类,因为它位于构建路径中,但它不能识别 jar-A 的类。它说“无法解析某些 X 的类的类型。它是从所需的 .class 文件中间接引用的”,其中某个 X 类位于 jar-A 中。不应该从导出此类的所需捆绑插件-A 中识别此 X 类吗? 当我把这个 jar-A 放在插件 B 的捆绑路径中时,我不再遇到这个问题了。

【问题讨论】:

  • 这是构建时错误,而不是 OSGi 问题。当您说“'plugin-B' 在其构建路径中具有'jar-C' 并作为运行时依赖项”时,您能否准确解释您的意思?这有点模糊,无助于理解问题。
  • 我在 plugin-B 的 .classpath 文件以及 MANIFEST.MF 文件的 Class-Path: 头文件中添加了 jar-C。

标签: java compiler-errors osgi eclipse-rcp classloader


【解决方案1】:

我不确定我是否遵循所有这些,但只有插件的 MANIFEST.MF 文件中的 Export-Package 条目中列出的包可用于其他插件。

在 MANIFEST.MF 编辑器的“导出包”部分的“运行时”选项卡上指定这些。

我的一个插件中的示例 Export-Package 部分:

Export-Package: greg.music.core.common,
 greg.music.core.databinding,
 greg.music.core.e4util,
 greg.music.core.editor,
 greg.music.core.preferences,
 greg.music.core.progress,
 greg.music.core.services,
 greg.music.core.showin,
 greg.music.core.util,
 greg.music.core.views,
 greg.music.core.xml

【讨论】:

    猜你喜欢
    • 2012-06-18
    • 2020-04-19
    • 1970-01-01
    • 1970-01-01
    • 2015-07-13
    • 2023-03-09
    • 1970-01-01
    • 1970-01-01
    • 2017-03-22
    相关资源
    最近更新 更多