1

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

插件 A 清单:

.
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 环境中不是这样,是吗?

4

3 回答 3

0

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

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

也看到这个问题

更多关于扩展点的信息可以在这里找到

于 2012-08-07T13:22:19.630 回答
0

Eclipse 插件/OSGi 包都有自己独立的类加载器(因此也有命名空间)。包私有意味着相同的包和类加载器。

于 2012-08-07T13:28:12.297 回答
0

尝试使捆绑 B 成为 A 的片段(如果可能的话)。比 B 可以访问包私有类,因为有相同的包名和类加载器。

阅读下面的文章拆分包——一个 OSGi 的噩梦——它清楚地解释了这个问题。

于 2012-08-08T10:18:58.070 回答