2

機能を通じて公開されているパッケージに依存する OSGI バンドルがあります。私が依存しているパッケージには、特定のバージョンのバンドルが必要com.company.antlr.runtime (3.0.1)です。この機能は、バンドルの 2 つのバージョンをパッケージ化しcom.company.antlr.runtime (3.0.1)com.company.antlr.runtime (3.2.0).

問題は、バンドル (フィーチャー内) と依存するパッケージを含むフィーチャーを使用して Eclipse でフィーチャー・ベースの起動構成を作成すると、必要なバンドルcom.company.antlr.runtime(3.0.1)が欠落していることを示す欠落制約検証エラーが発生することです。

機能の起動にバンドルとして追加com.company.antlr.runtime (3.0.1)しても効果はありません。同じ検証エラーが引き続き発生します。

一方、機能にパッケージ化されているものとまったく同じバンドルを含むバンドル ベースの起動構成を作成した場合、検証の問題はありません。

この問題は、次の最小限の例で説明できます。

バンドルorg.example.examplebundleにはマニフェストがあります。

Manifest-Version: 1.0 
Bundle-ManifestVersion: 2 
Bundle-Name:Examplebundle 
Bundle-SymbolicName: org.example.examplebundle 
Bundle-Version:1.0.0.qualifier 
Bundle-RequiredExecutionEnvironment: JavaSE-1.7 
Require-Bundle: com.company.antlr.runtime;bundle-version="[3.0.1,3.0.1]"

機能org.example.examplefeatureには feature.xml があります。

<feature
      id="org.example.examplefeature"
      label="Examplefeature"
      version="1.0.0.qualifier">

   <plugin
         id="org.eclipse.osgi"
         download-size="0"
         install-size="0"
         version="0.0.0"
         unpack="false"/>

   <plugin
         id="org.example.examplebundle"
         download-size="0"
         install-size="0"
         version="0.0.0"
         unpack="false"/>

   <plugin
         id="com.company.antlr.runtime"
         download-size="0"
         install-size="0"
         version="3.0.1"
         unpack="false"/>

   <plugin
         id="com.company.antlr.runtime"
         download-size="0"
         install-size="0"
         version="3.2.0"
         unpack="false"/>

</feature>

この機能だけで機能ベースの起動を行うと、検証エラーが発生します。機能に含まれる 4 つのバンドルを使用してバンドル ベースの起動を行っても、検証エラーは発生しません。

次に、コンソールを使用するために必要なバンドルを追加し、機能からバンドルを削除してorg.example.examplebundleから、org.example.examplefeature機能ベースの起動を使用して実行してみました。その後、バンドルcom.company.antlr.runtime (3.0.1)がまったく開始されていないことに気付きました。

同じ必要なバンドルをバンドル ベースの起動に追加すると、 と の両方 com.company.antlr.runtime (3.0.1)com.company.antlr.runtime (3.2.0)アクティブになっていることがわかります。

これに基づく私の推測では、機能ベースの起動のリゾルバーは、バージョン番号が最も高いバンドルで十分であると結論付けているため、古いバージョンはまったく起動しません。

com.company.antlr.runtime (3.0.1)その仮説を念頭に置いて、feature.xmlに次のスニペットを含めることで、完全に一致する必要があることを feature.xml で明示的に述べようとしました。

  <requires>
    <import 
      plugin="com.company.antlr.runtime"
      version="3.0.1"
      match="perfect"
      />
   </requires>

しかし、残念ながら、役に立ちませんでした。

それで、私の質問は次のとおりです。機能ベースのリリースを維持しながら、この問題を解決する方法はありますか?

完全を期すために:Eclipse Kepler 4.3およびOSGI 3.8.1を実行しています

4

1 に答える 1

0

バンドル ベースのランチャーを使用している場合、2 つのバンドルに対して自動開始を true に設定しているようです。「デフォルトの自動開始」を true に設定するか、製品定義を作成してそれらのバンドルの開始レベルを設定しない限り、機能ベースのランチャーを使用するときに同じことを行うことはできません。

于 2014-02-06T12:33:55.777 に答える