私はとに精通してImport-Package
いExport-Package
ますが、これは私にとって新しいものです。それは何をするためのものか?
3 に答える
OSGiコンテナーでの実行時には、何もしません。実際、それはOSGi仕様にも言及されていません(私はR4をチェックしました)。
ただし、.bnd
ビルド時にbndで使用するファイルで指定できます。もしそうなら、それはバンドルに何が入るかを決定するために使用することができます。bndがバンドルを構築すると、バンドルに入れる必要のあるクラスが自動的に決定されます。エクスポートされるパッケージ内のすべてのクラスが含まれ、それらが(推移的に)依存するすべてのクラスも含まれます。これは、クラスが使用されていないように見える場合、そのクラスはバンドルに含まれないことを意味します。ただし、Private-Package命令を使用して、パッケージの内容が未使用のように見える場合でも、バンドルにパッケージの内容を含めるようにbndに指示することができます。Private-Package命令が指定されていない場合、bndによって自動的に生成されます。
Private-Packageのドキュメントは次のとおりです。
プライベートパッケージ
含める方法はExport-Packageヘッダーと同じですが、唯一の違いは、これらのパッケージがエクスポートされないことです。このヘッダーはマニフェストにコピーされます。パッケージがエクスポートヘッダーとプライベートパッケージヘッダーではなく選択されている場合は、エクスポートが優先されます。
Private-Package=com。*
静的リンクとは何かを知っている場合は、Private-Packageを理解しています。それ以外の場合は読み進めてください。
Private-Packageは、jar内にある必要があるが、エクスポートされないパッケージを通知するbndの方法です。これはOSGiヘッダーではなく、bndの「命令」です。
この命令は、JARに含める必要のあるクラスパス(ワイルドカードを使用)からのパッケージを定義します。bndは、ほとんどのビルドツールのようなディレクトリではなく、仕様からJARにデータを入力するという点で独特です。その理由は、モジュールが「設計」され、そのレイアウトが慎重に検討されない限り、モジュールの利点が提供されることはめったにないためです。
一般に、Private-Packageは、他のバンドルと共有してはならないクラス、つまり実装クラスを保持するパッケージを指定します。一般に、bndが使用されている対応するプロジェクトから取得されますが、クラスパス上の他のJARから取得することは完全に許容されます。
1つのユースケースは、utilsを含むライブラリです。utilsは多くの無関係なものに依存する傾向があるため、バンドル内のutilライブラリを有効にすると、通常、依存関係が大混乱になります。1つの小さな方法を使用すると、突然30Mbの依存関係がドラッグされます。bnd自体は、aQute.lib *パッケージでこのモデルを多用しているため、このライブラリのパッケージをエクスポートしないでください。これは、バンドルサイズと「インターネットのダウンロード」の間のトレードです。Eclipseの世界とApacheFelixの世界の違いは明らかです。Apache Felixバンドルは通常スタンドアロンであり、すべての種類のサポートとutilバンドルを必要としませんが、Eclipseのバンドルは多くの配管バンドルを必要とする傾向があります。この違いは主にEclipseが原因だと思います。
Cの世界では、静的リンクと呼ばれるものがあります。プログラムがリンクされた後、未解決のものはライブラリから取得され、ターゲットに追加されます。ある程度、Private-Packageも同じ考えです。実際には、指定されたパッケージとそれらが一時的に依存するもの(パターンに該当する限り)を静的にリンクするヘッダーConditional-Packageがあります。
最後に、bndは、マニフェストのPrivate-Packageヘッダーにエクスポートされていない拡張パッケージを示しています。結局のところ、マニフェストは内容を説明することになっています...
作成者の場合は、-removeheaders:Private-Package(またはMavenでは<_removeheaders> Private-Packageを使用)を使用してヘッダーを削除できます。
実際、Private-Packageは、パッケージをエクスポートしないだけではありません。Private-Packageで指定されたパッケージが独自のプロジェクト内で定義されておらず、Import-Packageにインポートされていない場合、それらは自動的にjarにインライン化されます。したがって、これはOSGi以外の依存関係を含める簡単な方法です。インライン化はクラスパスの問題に簡単につながる可能性がありますが、注意してください。