1

パッケージfoo.barをエクスポートするプラグインAがあります。パッケージfoo.barには、デフォルトのスコープメンバーを持つ抽象クラスFooBarがあります。プラグインでは、BIは同じパッケージ内で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ではそうではありませんね??

4

3 に答える 3

0

正解です。OSGIプラグインはJavaパッケージと同じではありません。両方のプラグインで本当に同じ値を共有したい場合minは、拡張ポイントを介して共有するのが最善のオプションです。拡張ポイントは、プラグイン間でデータとコードを共有するためのOSGIの方法です。これは、プラグイン間の緊密な結合を引き起こさないソリューションにつながります。

プラグインBが本当にminプラグインAの値にアクセスする必要がある場合、これら2つのクラスが同じプラグインにある必要があることを示している可能性があります。

この質問も参照してください

拡張ポイントの詳細については、こちらをご覧ください。

于 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 に答える