Eclipse plugin Can';t访问依赖插件的包范围字段

Eclipse plugin Can';t访问依赖插件的包范围字段,eclipse-plugin,eclipse-rcp,Eclipse Plugin,Eclipse Rcp,我有一个导出foo.bar包的插件a。在包foo.bar中有一个抽象类FooBar,它具有默认的作用域成员。在插件B中,我喜欢在同一个包中扩展FooBar并访问默认范围的字段 插入清单: . Bundle-SymbolicName: A Export-Package: foo.bar . . Bundle-SymbolicName: B Require-Bundle: A . 插件B清单: . Bundle-SymbolicName: A Export-Package

我有一个导出foo.bar包的插件a。在包foo.bar中有一个抽象类FooBar,它具有默认的作用域成员。在插件B中,我喜欢在同一个包中扩展FooBar并访问默认范围的字段

插入清单:

.
Bundle-SymbolicName: A    
Export-Package: foo.bar
.
.
Bundle-SymbolicName: B    
Require-Bundle: A
.
插件B清单:

.
Bundle-SymbolicName: A    
Export-Package: foo.bar
.
.
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环境中不是这样的,是吗?

你是对的,OSGI插件和java包不一样。如果您确实想在两个插件中共享相同的
min
值,最好的选择是通过扩展点共享。扩展点是在插件之间共享数据和代码的OSGI方式。这导致了一个解决方案,它不会导致插件之间的紧密耦合

如果插件B确实必须访问插件A中的
min
值,这可能表明这两个类应该在同一个插件中

也看到


关于扩展点的更多信息可以在Eclipse插件/OSGi包中找到,每个插件都有各自独立的类加载器(以及名称空间)。Package private表示相同的包和类加载器。

尝试将bundle B作为a的片段(如果您的情况可能的话)。因为包名和类加载器相同,所以B可以访问包私有类


阅读下面的文章-它清楚地解释了问题。

插件B的捆绑符号名称真的是“A”吗?重复的名字可能会引起奇怪的行为。谢谢西蒙和弗雷德里克提供的信息。我的问题是我在几年前扩展了一个模式类的log4j框架,这个模式类扩展了PatternConverter。现在我必须将其移植到eclipse-bundles。请参见问题下的我的评论。请参见问题下的我的评论。