0

2つのバンドルAとBに存在するパッケージXYZがあります。

bundle A
 package X.Y.Z 
  class Class1

bundle B
 package X.Y.Z 
  class Class2

バンドルBはパッケージXYZをエクスポートしますバンドルAはパッケージXYZをインポートし、自分のクラスClass1が見つからないという例外を受け取ります。それは機能するはずですか?

私はfelixでglassfish3.1を使用しています

4

2 に答える 2

2

いいえ、動作しないはずです。パッケージXYZをインポートすると、そのインポートがバンドル自体の内部コンテンツよりも優先して使用されます。

より一般的には、分割パッケージと呼ばれる問題があります。パッケージは一貫性があり、複数のバンドルにまみれるのではなく、単一のバンドルでエクスポートする必要があります。パッケージXYZに属するすべてのクラスが単一のバンドルに存在するように、バンドルの内容をリファクタリングする必要があります。

于 2011-08-29T05:48:35.400 に答える
0

繰り返しますが、ニールは絶対に正しいです。ただし、ベンダーによっては、何らかの理由で、同じパッケージを含む複数の.jarファイルが存在する場合があります。これは、製品の目立たない実装のために小さな.jarファイルを提供したい場合に行われることがあります。これが行われる理由の例は、XMLドキュメントのテキスト処理アルゴリズムとは異なるEDIドキュメントのテキスト処理アルゴリズムがある場合です。この例では、異なる実装クラスを含む「badlyPlannedImplementation.util」を含む2つの.jar(バージョン1および2)ファイルを作成することを選択できます。個人的には、これに遭遇したのは2、3回だけですが、問題はどのように処理するかです。

同じパッケージをエクスポートする2つの.jarファイルがあり、両方のパッケージクラスにアクセスしたいという問題が発生した場合は、「シェーディング」と呼ばれるメカニズムを使用します。シェーディングとは、これら2つのパッケージを取得し、それらのコンテンツを別の.jarファイルパッケージにまとめる場合です。これは、以前は「maven-shade-plugin」と呼ばれるmavenプラグインによって実行されていましたが、現在は機能がmaven-bundleプラグインの一部になっています。

まず、新しいプロジェクトを作成します。これを「badlyPlannedImplementationShaded」と呼びます。次に、プロジェクトでpom.xmlファイルを作成します。依存関係のセクションに、一緒にシェーディングしようとしている両方の.jarファイルの依存関係を含めます。

次に、ビルドセクションに以下を追加します。

<plugin>
   <groupId>org.apache.felix</groupId>
   <artifactId>maven-bundle-plugin</artifactid>
   <version>2.1.0</version>
   <extensions>true</extensions>
   <configuration>
      <instructions>
         <Bundle-Version>${project.version}</Bundle-Version>
         <Export-Package>
            badlyPlannedImplementation.util;version="1",
            badlyPlannedImplementation.util;version="2"
         </Export-Package>
      </instructions>
   </configuration>
</plugin> 

これを行うと、使用しようとした2つの.jarファイルのすべてのクラスを含むutilパッケージを含む新しいバンドルが作成されます。

お役に立てば幸いです。

于 2011-09-14T16:39:53.367 に答える