我有一个插件A导出包foo.bar。在包foo.bar中,有一个带有默认范围成员的抽象类FooBar。在插件B中,我喜欢在同一个包中扩展FooBar并访问默认的作用域字段。
插件清单:
.
Bundle-SymbolicName: A
Export-Package: foo.bar
.
插件B清单:
.
Bundle-SymbolicName: B
Require-Bundle: A
.
插件A中的类FooBar:
package foo.bar;
public abstract class FooBar{
int min = -1;
}
插件B中的MyFooBar类:
package foo.bar;
public class MyFooBar extends FooBar{
public void setMin(int min){
this.min = min;
}
}
结果:
..原因:java.lang.IllegalAccessError:试图从类foo.bar.MyFooBar访问字段foo.bar.FooBar.min
在普通的java环境中,如果我在同一个包中定义我的类,我可以访问包范围的成员。显然在OSGI-Environment中不是这样,是吗??
答案 0 :(得分:0)
你是对的,OSGI插件与java包不一样。如果您真的想在两个插件中共享相同的min
值,最好的选择是通过扩展点共享它。扩展点是OSGI在插件之间共享数据和代码的方式。这导致了一种解决方案,它不会导致插件之间的紧密耦合。
如果插件B真的必须访问插件A中的min
值,这可能表明这两个类应该在同一个插件中。
有关扩展点的更多信息,请访问here
答案 1 :(得分:0)
Eclipse插件/ OSGi包每个都有自己独立的类加载器(以及命名空间)。包私有意味着相同的包和类加载器。
答案 2 :(得分:0)
尝试将B捆绑为A的片段(如果在您的情况下可行)。比B可以访问 package-private 类,因为有相同的包名和类加载器。
阅读以下文章Split Packages – An OSGi nightmare - 它以清晰的方式解释了问题。