2016-04-05 7 views
3

サードパーティのフレームワークにOSGiバンドルを読み込むのに問題があります。存在しないImport-Packageのバージョンを指定しているので、私のバンドルを拒否し続けます。バンドルに必要なバージョンをロードしていることはわかっていますが。この問題を回避するために、一時的にバージョン要件を無効にしましたが、少し醜いです。OSGIインポートパッケージ:バージョン対バンドルバージョン - 違いは何ですか?

Import-Package: com.ghc.ghTester.expressions,org.apache.ws.security;vers 
ion=0,org.apache.ws.security.components.crypto;version=0,org.apache.ws. 
security.message;version=0,org.apache.ws.security.message.token;version 
=0,org.apache.ws.security.processor;version=0 

私は私の依存関係のためのマニフェストを見ると、私は次を参照してください。

Bundle-Version: 1.5.11 
Bundle-ClassPath: wss4j-1.5.11.jar 
Bundle-Vendor: Apache 
Export-Package: org.apache.ws.axis.security, 
org.apache.ws.axis.security.handler, 
org.apache.ws.security, 
org.apache.ws.security.action, 
org.apache.ws.security.components.crypto, 
org.apache.ws.security.conversation, 
org.apache.ws.security.conversation.dkalgo, 
org.apache.ws.security.handler, 
org.apache.ws.security.message, 
org.apache.ws.security.message.token, 
org.apache.ws.security.processor, 
org.apache.ws.security.saml, 
org.apache.ws.security.transform, 
org.apache.ws.security.util 

Frameworkのチームに不満をした後、彼らは私が私のImport-Packagebundle-versionなくversionを使用する必要があることを私に言ってきました以下のような文:

Import-Pacakge: org.apache.ws.security;bundle-version=[1.5.0,2) 

私はOSGi Specs (page 50)を読みましたが、 に見えることはできません

開発者は、任意の一致属性を指定することができます。輸出の パッケージのバージョンを選択するには、バージョン範囲 -

•バージョン:以下の任意のマッチング属性が事前に定義されている 58ページ マッチング属性を参照してください。構文は、36ページの「バージョン範囲」に従わなければなりません。 バージョン選択の詳細については、セマンティックバージョン管理( )を参照してください。この属性を指定しないと、[0.0.0、∞]とみなされます。

•specification-version - この属性は、以前のバージョンからの移行を容易にするためにのみ、バージョン属性 のエイリアスです。バージョン属性が の場合、値は等しくなければなりません。

•bundle-symbolic-name - エクスポートする バンドルのバンドル記号名。フラグメントバンドルの場合、これはホスト バンドルのシンボリック名になります。

•bundle-version - エクスポートするバンドルのバンドルバージョン を選択するバージョン範囲。デフォルト値は [0.0.0、∞]です。セマンティックバージョニング(54ページ)を参照してください。 フラグメントバンドルの場合、バージョンはホストバンドルからのものです。

versionbundle-versionの違いを明確にしてもらえますか?私がドキュメントを読む方法から、バンドルバージョン(つまりマニフェストのBundle-Version)はバンドル内のすべてのパッケージに拡張されます。だからパッケージのバージョン(すなわち:バージョン)は、Import-Packageステートメントのbundle-version(すなわち:bundle-version)と同じではないでしょうか?なぜ2つの異なる方法を指定できるのでしょうか?

答えて

7

これはかなり簡単です:bundle-versionはパッケージをエクスポートしているバンドルのバージョンにバインドしますが、versionはパッケージ自体のバージョンにバインドします。

あなたはほとんどではありませんbundle-versionインポートします。輸出バンドルのバージョンはかなり無関係です...実際にあなたがパッケージをインポートしているときには、それをエクスポートするバンドルのIDについて気にするべきではありません。あなたが心配しているパッケージであり、付属のバンドルではありません。

誰がbundle-versionを使用するように指示しましたか?非常に特別な理由があるかもしれませんが、私はそれを疑っています。あなたにこれを言った人は、間違いです。

あなたは尋ねた:

をので、パッケージのバージョン(例:バージョン)がありません:インポートパッケージのステートメントのバンドル版(バンドル版IE)と同じになりますか?

いいえ、それはありません。バンドル版はパッケージ版とは関係ありません。パッケージを変更すると、そのパッケージのバージョンが変更されます。バンドルは単なる配信メカニズムです。あなたの質問を読み直す

UPDATE

は、私は、依存関係によってエクスポートされたパッケージのバージョンが指定されていないことに注意してください。これは、バージョンが指定されていない場合、これがデフォルトのバージョンであるため、フレームワークがすべてをバージョン0.0.0としてエクスポートしていることを意味します。パッケージのバージョンは、それが住んでいるバンドルのバージョンを強調しません。残念なことに、このフレームワークの著者はOSGiをよく理解していないようです。

UPDATE 2

あなたはバージョンを提供していない使用しているフレームワークは、私はノーコードラッパーバンドル作成することをお勧めしますので、付属の適切なバージョンのパッケージを再エクスポートします。これは構築が非常に簡単で、すべての醜さを1か所に保持します。他のバンドルであれば、通常のバージョンのパッケージを単純にインポートできます。

問題のあるバンドルのBSNを私に教えてくれないので、私はそれを "org.foo"と呼んでいます。次のように最初のmanifest.txtというファイルを作成します。

Bundle-ManifestVersion: 2 
Bundle-SymbolicName: org.foo.wrapper 
Bundle-Version: 1.5.11 
Require-Bundle: org.foo; bundle-version="[1.5.11,1.5.11]" 
Export-Package: org.apache.ws.axis.security;version=1.5, 
org.apache.ws.axis.security.handler;version=1.5, 
... 

(もちろん、私はあなたが修正することができ、ここでバージョンに関する他のいくつかの仮定を行っている。)

を今すぐにバンドルを構築する:

jar cfm wrapper.jar manifest.txt 

は今、あなたはこのバンドルを持っていることを、あなたの通常のバンドルは、このようなパッケージをインポートすることができます。

Import-Package: org.apache.ws.security; version="[1.5,2)" 

うまくいけば、bndに基づくツールを使用しています。この場合、バージョン範囲を含めてImport-Packageヘッダーが生成されます。

+0

だからどこで/どのようにパッケージのバージョンを指定しますか?マニフェストに、それがどのバージョンであるかを示すステートメントがありますか?またはpackage-info.javaファイル内にありますか? –

+0

私の更新を見てください。バンドルのソースでは、 'package-info.java'にバージョンを指定できますが、ビルド済みのバイナリバンドルを使用しているようです。その場合、エクスポートのバージョンはMANIFEST.MFの 'Export-Package'ヘッダーによって純粋に定義されます。バンドルはバージョンを指定していないので、すべてのバージョンは0です。 –

+0

私はそれに従うと思います。私が使用しているフレームワークでは、あらかじめ構築されたバイナリ(例:Apache WSS4j 1.5)を取り出し、マニフェストのエントリを介してパッケージを公開するマニフェストを書き直したようです。だから私がバンドル版への依存を変えたいのであれば、この特定のフレームワークを対象とした真のOSGi環境では技術的に正しいとは言えませんが、正しく動作するはずです。指定したbundle-versionが公開するすべてのパッケージを基本的に示しますか?それは正確ですか? –

関連する問題