Java OSGi超类可见性

Java OSGi超类可见性,java,class,package,osgi,Java,Class,Package,Osgi,我有一个子类,它引用另一个包中的超类。我是否需要导出这两个包,以使bundle引用和子类 例如: BundleOne exports packageB packageA: interface i packageB: abstract class B implements i BundleTwo imports packageB packageC: class C extends B 这个例子对我不起作用,osgi框架抱怨packageA缺少导入包约束。我觉得这很奇怪,因为我在C班的任何地方都

我有一个子类,它引用另一个包中的超类。我是否需要导出这两个包,以使bundle引用和子类

例如:

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

BundleTwo imports packageB
packageC: class C extends B
这个例子对我不起作用,osgi框架抱怨packageA缺少导入包约束。我觉得这很奇怪,因为我在C班的任何地方都没有提到它


导入包声明是由一个maven插件自动构建的,我认为它在幕后使用了bnd。

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


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

是的,必须同时导出这两个超类,B的类定义依赖于a,因此在没有a的情况下也不能引用B


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

是的,确实如此。我想我没想清楚。所以我认为,导入/导出必须一直向上,就像层次结构一样高。是的。因为所有超类型和声明的接口都是该类型的公共签名的一部分。它们被类型“使用”,这就是为什么存在使用约束的原因。