3

仕様で正確に定義されていることは知っていますが、その理由はわかりません。

A class space is then all classes reachable from a given bundle’s class loader. 
Thus, a class space for a given bundle can contain classes from:
• The parent class loader (normally java.* packages from the boot class path)
• Imported packages
• Required  bundles
• The bundle's class path (private packages)
• Attached fragments

仮定しましょう:

  1. バンドルは「import-package: a」を宣言します
  2. このバンドルにはローカル クラス aX があります
  3. 別のバンドルにクラス aX があります

new aX() は別のバンドルからクラスをロードします。

インポートされたクラスがバンドル クラスよりも優先される理由は何ですか? それはJava階層クラスのロードポリシーの結果としての継続ですか?

4

1 に答える 1

5

これは、実際には OSGi の中核的な側面です。

クラスの共有

インポート/エクスポート メカニズム全体は、通信時に異なるバンドルが同じクラスを使用できるようにすることを目的としています。この場合の「同じ」とは、バイナリが等しいだけでなく、同じクラス ローダーによってロードされることを意味します (すべてのバンドルには独自のクラス ローダーがあることを思い出してください)。バンドル自身のクラスがインポートされたクラスよりも優先される場合、バンドルはクラスのどのコピーを使用するかについて「合意」できなくなります。

しかし、なぜ?

インポートしようとしているクラスのコピーを持っているのはなぜですか? 何らかのロギングを行いたい状況を考えてみましょorg.osgi.service.logLogService。今、

  • パッケージのみをインポートすると、バンドルが解決されず、起動に失敗します。
  • クラスのみを含める場合、他のバンドルのLogServiceクラスを使用することはないため、サービスを使用できません (これは同意する部分です)。

この状況では、クラスのインポートとインクルードの両方を行うため、どちらの状況でも実行できます。他の人がコピーを持っていない場合は自分のコピーを使用し、他の人が持っている場合はコピーを共有します。コピーをエクスポートすることを選択して、フレームワークに決定させることもできます。

補足として、これはまさに、エクスポートしたものを (ほぼ) 常にインポートする必要がある理由です。

于 2012-06-19T15:30:16.177 に答える