【问题标题】:OSGi superclass visibilityOSGi 超类可见性
【发布时间】:2014-01-15 03:52:41
【问题描述】:

我有一个引用不同包中的超类的子类。我是否需要导出这两个包,才能让包引用和子类。

示例:

BundleOne exports packageB
packageA: interface i
packageB: abstract class B implements i

BundleTwo imports packageB
packageC: class C extends B

这个例子对我不起作用,并且 osgi 框架抱怨 packageA 缺少导入包约束。我觉得这很奇怪,因为我在 C 类的任何地方都没有提到它。

import-package 声明是由一个 maven 插件自动构建的,我认为它在幕后使用 bnd。

【问题讨论】:

    标签: java class package osgi


    【解决方案1】:

    是的,您绝对必须导出这两个包。为什么你觉得这很奇怪?您确实从包A 中引用了接口I,因为您引用了B 一个I

    事实上,您的课程C 也是I。为了有机会构建您的类,Java 虚拟机必须具有完整的超类层次结构的可见性。

    【讨论】:

    • 是的,没错。我想我想的不是很清楚。所以我认为,进口/出口必须一直向上,与层次结构一样高。
    • 是的。因为所有超类型和声明的接口都是该类型的公共签名的一部分。它们被类型“使用”,这就是存在使用约束的原因。
    【解决方案2】:

    是的,你必须同时导出,B 的类定义依赖于 A,因此你也不能在没有 A 的情况下引用 B。

    这类似于一个简单的 java 应用程序,其中包 A 在 A.jar 中,B 在 B.jar 中。如果在运行时,A.jar 不可用,那么您无法实现 B,因为它的部分定义丢失了。

    【讨论】:

      猜你喜欢
      • 2010-10-26
      • 2013-10-25
      • 1970-01-01
      • 2020-12-31
      • 1970-01-01
      • 2014-09-25
      • 1970-01-01
      • 1970-01-01
      • 2020-06-09
      相关资源
      最近更新 更多