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を使用しています
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を使用しています
いいえ、動作しないはずです。パッケージXYZをインポートすると、そのインポートがバンドル自体の内部コンテンツよりも優先して使用されます。
より一般的には、分割パッケージと呼ばれる問題があります。パッケージは一貫性があり、複数のバンドルにまみれるのではなく、単一のバンドルでエクスポートする必要があります。パッケージXYZに属するすべてのクラスが単一のバンドルに存在するように、バンドルの内容をリファクタリングする必要があります。
繰り返しますが、ニールは絶対に正しいです。ただし、ベンダーによっては、何らかの理由で、同じパッケージを含む複数の.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パッケージを含む新しいバンドルが作成されます。
お役に立てば幸いです。