OSGi では、バージョン番号とバージョン範囲を使用する場合、定義された依存関係の解決プロセス、つまりパッケージのインポートとエクスポートはかなり厳密です。バージョン 1.2.3 の一部のパッケージ インポートで、1.2.3 を含む範囲の対応するエクスポートが見つからない場合、バンドルを解決または開始できません。これはいい。
ただし、これはコア パッケージには適用されないようですorg.osgi.framework
。Equinox (3.8.0) と Apache Felix (4.0.3) の両方の現在のバージョンはorg.osgi.framework,version=1.7.0
、エクスポートされたパッケージの 1 つとして定義されます。ただし、このパッケージの特定の下位バージョンを必要とするバンドル (例: Import-Package: org.osgi.framework;version=1.3
) は、引き続きこの新しいバージョンに解決されます。バンドルが解決されないことを期待します。
この動作はどのように説明できますか? これは OSGi 実装の誤動作ですか? コア OSGi パッケージを解決するときに例外がありませんか? または、Karaf がここで邪魔になっています (Apache Karaf でこれをテストしました。以下を参照してください)。
バージョンを明示的に宣言したくないこと、およびバージョンが完全に解決可能な範囲になることを知っています。ただし、そのようなインポートを定義する私の管理下にないバンドルがあります (つまり、iPOJO、以下を参照)。
セットアップの詳細: それぞれ Equinox または Felix を有効にして、Karaf 2.3.2 および 2.3.3 でこれをテストしました。私がテストに使用したデモ バンドルは githubで見つけることができます。これはそのままビルドでき、新しい Karaf コンテナーにデプロイすると失敗が表示されます。私がこれを発見した理由は、コア iPOJO バンドルが範囲ではなくそのような明示的なバージョンを定義しているためです。これを Karaf 機能記述子に追加し、Karaf Features Maven Pluginを使用して機能のエクスポート/インポートの整合性を検証しようとしましたが、失敗しました。