3

OSGi フラグメントを追加して、ホスト OSGi バンドル内の特定のリソースを置き換えたいと考えています。

私が理解しているように、OSGi フラグメントに含まれるリソースは、ホスト バンドルのクラスパスに追加されるだけです。フラグメントがホスト バンドルに既に存在するリソースを追加している場合、フラグメントのリソースが読み込まれるという保証はありません。それはホスト バージョンのままである可​​能性もあります。

リソースのフラグメント バージョンがホスト バージョンの代わりにロードされることを確認するために、 http: //wiki.osgi.org/wiki/Fragment は、Bundle-ClassPath ヘッダーを使用してリソースを「最初」として指定することが可能であると述べています。 (好ましい)。

例として patch.jar を示します。

Bundle-ClassPath: patch.jar,.

そこで述べたように、「patch.jar は '.' よりも進んでいるため ホストではなくフラグメントからクラスを優先的にロードできるようになります。」

この手法を使用することもできますが、これは、まずフラグメント リソースを別の jar にバンドルしてから、この jar をフラグメント バンドルに含める必要があることを意味します。

フラグメントにjarを含めることなく、ホストではなくフラグメントからクラス/リソースを優先的にロードする方法はありますか?

4

3 に答える 3

4

jar を含める必要はありません。代わりに「パッチ」ディレクトリを使用して、フラグメントのパッチ ディレクトリにクラスを配置できます。

于 2014-01-20T18:08:12.660 に答える
1

わかりました、あなたが望むことを達成する方法がいくつかあります。私が理解しているように、すべてが完了したら、パッチバンドルにあるパッケージを除いて、ライブラリバンドルからパッケージをエクスポートしたいと考えています。

これを行うには、ライブラリ バンドルの Manifest.MF で、「.」の代わりにエクスポートする明示的なパッケージを指定します。元のバンドルを変更する必要がないように、フラグメントでこれを行うことができます。次に、パッチ バンドルで同じことを行います。

もう 1 つのオプションは、maven-bundle-plugin を使用して、パッチ バンドルとライブラリ バンドルを新しいバンドルに「シェーディング」(マージ) することです。パッチ バンドルとライブラリ バンドルのバージョン番号が異なる限り、これも機能します。多くのブログでは、このオプションに maven-bundle-plugin と一緒に maven-shade-plugin を使用するように指示されていますが、それらは正しくありません。maven-bundle-plugin を使用すると、間違いなくシェーディングを実行できます。

于 2014-01-20T17:46:30.803 に答える
1

まだ苦労している人のために、これらは私のために働いた正確な手順です:

  1. 置き換えたいリソース/クラスでフラグメント プロジェクトを作成します

  2. フラグメントの build.properties で、source.. = src/andoutput.. = bin/source.patch/ = src/andに変更します。output.patch/ = bin/

  3. フラグメントのマニフェストでpatch/、バンドルのクラスパスに追加します

置き換えたいクラスを持つcom.example.uiプラグインがあるとします。com.example.ui.MessageDialog

  • フラグメント プロジェクトを作成するcom.example.ui.fragment

  • パッケージMessageDialog内にクラスを作成します ( ではありません)。com.example.uicom.example.ui.fragment

  • フラグメントの build.properties ファイルを次のように編集します。

    source.patch/ = src/
    output.patch/ = bin/
    
  • フラグメントのマニフェストに次を追加します。

    Bundle-ClassPath: patch/
    
  • マニフェストで、com.example.uiバンドル クラスパスを変更します。

    Bundle-ClassPath: patch/,. 
    
于 2014-12-08T09:25:38.560 に答える