2012-01-24 3 views
4

私はSpring OSGIとBlueprintに精通していますが、多くの初心者のように "classpath"の問題があります。バンドルを消費することによって、Spring OSGIサービス参照インタフェースを明示的にインポートする必要がありますか?

私は2つのOSGIバンドルを持っています.1つは、さまざまな豆を定義しています(Blueprintを使用して、重要ではない)。サービスとしてエクスポートします。 (Spring OSGIを使用して)サービスBeanを参照し、それらをいくつかのApache Camelルートにプラグインするもう1つのバンドルです。

サービスプロバイダーのバンドルの青写真は、次のようになります。

<service id="camelTsvDataFormat" 
    interface="org.apache.camel.spi.DataFormat"> 
    <bean class="org.apache.camel.component.flatpack.FlatpackDataFormat"/> 
</service> 

サービス・コンシューマー・バンドルの春のコンテキストは次のようなものになります。

<osgi:reference id="tsvDataFormat" 
    interface="org.apache.camel.spi.DataFormat" /> 

<camel:camelContext> 
    <route> 
     <from uri="vm:in"> 
     <setBody> 
      <constant>SELECT * FROM myTable</constant> 
     </setBody> 
     <to uri="jdbc:myDataSource" /> 
     <marshal ref="tsvDataFormat" /> 
     <to uri="file:/path/to/my/files/?fileName=out.tsv" /> 
    </route> 
</camel:camelContext> 

を...しかし、展開時に、春は「見つかりませんクラス[org.apache.camel.spi.DataFormat] "。 Bnd命令のImport-Packageセクションにインターフェイスを追加することはできますが、手動で別の場所にクラスを2回リストする必要があります。

別の選択肢は、自分のプロジェクト内でインターフェイスを拡張してBndが自動的にそれを受け取るようにすることですが、これはおおむね問題になります。

私は、実際にインターフェイスクラスを解決することなく、インターフェイス名によるサービスのルックアップを期待していると思います。これはna ïですか?あるいは、Bndが私のappContextのサービス参照のインターフェースを自動的にインポートする方法がありますか? Bndがこれを行うことができる場合(例えば、プラグインを使用する場合)、Apache FelixバンドルプラグインでBndプラグインをMaven用に使用する標準的な方法はありますか?

+0

これは私が見つけることができる最も近い議論は次のとおりです。 http://forum.springsource.org/archive/index.php/t-52913.html – RubyTuesdayDONO

+0

別の思考 - このないように大した場合がありますサービスプロバイダのインターフェースはApache Camelのように "spi"パッケージにうまく収められていますか? – RubyTuesdayDONO

+0

通常、bndはバイトコードで参照されているパッケージのインポートを追加します。 tsvDataFormatフィールドはどのクラスですか? –

答えて

3

Hollyが示唆するように、bndは通常、このパッケージを呼び出すバンドル内のバイトコードから参照されるこのパッケージを検索します。また、Spring-DM XMLファイルが適切な場所にあるかどうかを調べる必要があります。しかし、BlueprintのXMLファイルが、同じバンドルの場所にないため、同じ方法でまだサポートされているかどうかはわかりません。したがって、あなたのバージョンのbndをアップグレードするか、Blueprintをサポートするプラグインを使用する必要があります。

しかし、私はこのすべてを疑っています。インターフェイスへのバイトコードの参照がない場合、サービス参照を使用していないようです。その場合は、単にそれを削除しないでください。

+0

'tsvDataFormat' BeanはBlueprintを使用して別の別のバンドルからOSGIサービスとしてエクスポートされるため、バイトコードは直接参照されません。 Spring-OSGIを使ってリファレンスをインポートする、このバンドル用の私のプロジェクトクラス。これを最初に明確にしていないことをお詫び申し上げます。しかし、SpringがApache CamelのルートにBeanをプラグインする必要がある場合を除いて、私はインターフェースに直接関心がありません。 OSGIは、参照されるサービスのインタフェースクラスを自動的に/動的にインポートしないか? – RubyTuesdayDONO

+0

@RubyTuesdayDONO私は、サービスの実装のためのバイトコードについて言及していません。これは別のバンドルにあり、インポートするべきではないと言います。あなたのバンドルのどのクラスでも参照される* interface *について話しています。どこにでもサービスを参照していない場合は、実際にサービスを呼び出すコードがないことを意味します。したがって、参照が必要な理由がまだ分かりません。 –

+0

@RubyTuesdayDONOあなたの他の質問について:いいえ、OSGiは何も自動的にインポートしません(まあ、1つの例外があります:JREの 'java。*'パッケージは常に見えます)。サービスインタフェースを含め、可視性を持たせたいすべてのパッケージをインポートする必要があります。通常は、コードからそのインタフェースへの参照が表示されるため、インポートは自動的にbndによって追加されます。ありがとう、@ Neil。 –

1

@Neil Bartlettが示したように、Bndはバンドル内の標準的な場所にある春と青写真のファイルを調べるべきです(META-INF/springOSGI-INF/blueprint)。私は手動でPOMにMETA-INF/spring/*.xmlOSGI-INF/blueprint/*.xmlというようにオーバーライドしました。私はOSGIプラットフォームのSpringとBlueprintエクステンダがヘッダーを受け入れ、それぞれのコンテナをブートストラップしたので、これは問題ないと思いました。しかし、Bndは、グロブのない簡単なヘッダーを期待しています(SpringXMLType.java参照)。私はそれが素晴らしいツールだから不具合を割り当てることを意味するものではありませんが、この1つは私をオフガードにしました。

私の春と青写真のマークアップはすでに標準の場所にあるので、私はPOMから冗長なBnd命令を削除したばかりで、すべてのSpring-DMサービス参照インターフェースは自動的にピックアップされ、Import-Packageがバンドルに入っています:

<plugin> 
    <groupId>org.apache.felix</groupId> 
    <artifactId>maven-bundle-plugin</artifactId> 
    <version>2.3.6</version> 
    <extensions>true</extensions> 
    <configuration> 
     <instructions> 
      <Bundle-Version>${project.version}.${buildNumber}</Bundle-Version> 
      <Bundle-Activator>com.example.BundleActivator</Bundle-Activator> 
      <!-- 
       <Spring-Context>META-INF/spring/*.xml</Spring-Context> 
       <Bundle-Blueprint>OSGI-INF/blueprint*.xml</Bundle-Blueprint> 
      --> 
     </instructions> 
    </configuration> 
</plugin> 
関連する問題