4

私はOSGIセマンティックバージョニング(テクニカルホワイトペーパー)に精通しています。ただし、OSGIサービス用に提案されたバージョン管理の概念は見当たりません。

単純な状況:com.services.payments.PaymentServiceとして登録されたサービスを提供しています。これは、メソッドvoid makePayment(Integer amount、String accountNo)を実行し、バンドルバージョン1.0としてパックしています。次に、変更されたインターフェイスでサービスを更新します。このメソッドを削除し、新しいメソッドmakePaymentInDifferentWay(整数量、文字列accountNo)を追加し、新しいサービスをバンドルバージョン2.0としてパッケージ化します。最初のバンドルが停止した後、クライアントは2番目のサービスを配線し、クラッシュしますメソッドシグネチャはバイナリ互換ではないため、サービスの呼び出し時に。このような状況は、Javaパッケージを処理することで完全に解決されますが、OSGIサービスですぐに使用できるバージョン管理機能はありません。私は何かが足りないのですか?(「service.version」などのサービスプロパティを設定し、クライアント側でこのプロパティによって提供されるサービスをフィルタリングするか、APIパッケージまたはクラス名の名前を変更するだけで、バージョン管理スキームを事前に設計できることはわかっていますが、ボックスのバージョン管理が提供されないのはなぜですか?たぶん、他のもっと標準的な方法の解決策がありますか?たぶん、私が単に理解していなかったサービスに関連するいくつかの概念がありますか?)

4

2 に答える 2

3

クライアントは、次のようなバージョンをImport-Packageステートメント(またはRequire-Bundle)ステートメントに含める必要があります。

Import-Package: com.services.payments;version="[1.0,2.0)"

そして、サービスはパッケージを次のようにエクスポートします。

Export-Package:  com.services.payments;version="1.0.0"

最初のバンドルを停止して2番目のバンドルをインストールした後、クライアントは解決されません(必要な制約があるため、com.services.payments;version="[1.0,2.0)"満たされません)。

さらに、2つのAPIパッケージがあり、1つはバージョンが「1.0.0」で、もう1つはバージョンが「2.0.0」で、クライアントが「1.0.0」のAPIをインポートしている場合、クライアントはAPIを実装するサービスを「認識」しません。バージョン「2.0.0」。

于 2012-05-17T16:10:14.617 に答える
3

サービスはタイプであり、タイプはパッケージに含まれています。したがって、サービスのバージョンは、サービスタイプを含むパッケージのバージョンです。OSGiフレームワークは、クライアントがサービスのプロバイダーと同じサービス・タイプのパッケージを使用している場合にのみ、クライアントにサービスを公開するようにします。

于 2012-05-17T16:18:38.600 に答える