2017-05-01 1 views
1

osgi-jax-rs-connector、jersey、およびbndtoolsを使用して簡単なosgi restエンドポイントを取得しようとしています。OSGI REST "Jerseyがまだ準備されていません" - HK2 ServiceLocatorGeneratorのデフォルトの実装が見つかりません

私はpublisher-5.3.1.jarバンドルとjersey-all-2.22.2.jarバンドル(どちらもosgi-jax-rs-connectorによって提供されています)を自分自身の別々のバンドルにまとめています。注釈を使用して残りのエンドポイントを提供する別のバンドルがあります。

bndrunファイルを使用してApache Felixで解決して実行でき、gogoシェルで自分の残りのエンドポイントがcom.eclipsesource.jaxrs.publisherで使用されるosgiサービスとして登録されていることを確認します。

アプリが起動すると、それが記録されます:

org.glassfish.hk2.utilities.reflection.Logger warning 
WARNING: Cannot find a default implementation of the HK2 ServiceLocatorGenerator 

を、私は私が手ブラウザから私のAPIをヒットしようとすると:

HTTP ERROR: 503 
Problem accessing /services/my-service. Reason: 
Jersey is not ready yet! 
Powered by Jetty:// 

私のラップジャージ/パブリッシャbnd.bndファイルは次のとおりです。

Bundle-Version: 2.22.2.${tstamp} 

javac.source: 1.8 
javac.target: 1.8 

-includeresource: OSGI-OPT/[email protected]/jersey-publisher.jar 
-classpath: lib/jersey-all-2.22.2.jar, lib/publisher-5.3.1.jar 
-sources: true 

Export-Package: javax.ws.rs*;version=2.0,\ 
    org.jvnet.hk2.annotations;version="1.0",\ 
    org.jvnet.hk2.component;version="1.0",\ 
    org.jvnet.hk2.external.generator;version="1.0",\ 
    org.jvnet.hk2.external.runtime;version="1.0";uses:="org.jvnet.hk2.annotations",\ 
    org.jvnet.hk2.internal;version="1.0";uses:="org.jvnet.hk2.external.runtime",\ 
    org.jvnet.mimepull;version="1.0",\ 
    org.jvnet.tiger_types;version="1.0" 

-privatepackage: * 

Import-Package: !jersey.repackaged.com.google.common.cache.LocalCache.jersey.repackaged.*,\ 
    !jersey.repackaged.com.google.common.collect.AbstractMapBasedMultimap.jersey.repackaged.*,\ 
    !jersey.repackaged.com.google.common.collect.AbstractMultimap.jersey.repackaged.*,\ 
    !jersey.repackaged.com.google.common.collect.FilteredKeyMultimap.jersey.repackaged.*,\ 
    !jersey.repackaged.com.google.common.collect.ImmutableMultimap.jersey.repackaged.*,\ 
    !jersey.repackaged.com.google.common.collect.MapMakerInternalMap.jersey.repackaged.*\ 
    * 

私はorg.jvnet.hk2.external.generator.ServiceLocatorGeneratorImplがSを実装するクラスであることがわかりますerviceLocatorGeneratorインターフェース(アクティブなjersey-allバンドルjarファイルに含まれています)と、ラップされたラップバンドルjarファイルが含まれています。

答えて

0

HK2 ServiceLocatorGeneratorエラーは、jersey-all jarに、JDKのライブラリjava.util.ServiceLoaderシンプルサービス提供クラスに関連するいくつかのプロバイダ設定ファイルが含まれていることを示します(https://docs.oracle.com/javase/8/docs/api/java/util/ServiceLoader.htmlを参照)。

これらのサービスはもともとjersey依存関係のhk2-locator jarファイルに存在していました。

これは、私のラッピングバンドルに、META-INF/services/org.glassfish.hk2.extension.ServiceLocatorGeneratorのファイルがjersey-all.jarに含まれていることによって修正されました。これを実現するbnd宣言は、

-includeresource: @lib/jersey-all-2.22.2.jar!/META-INF/services/org.glassfish.hk2.extension.ServiceLocatorGenerator 

です。これで問題が完全に修正され、残りのエンドポイントが正常に動作しました。興味深いことに、他のMETA-INF/services/*ファイルが生成されたバンドルに含まれていると宣言したとき、結果はいくつかのより多くのエラーでしたが、単純にServiceLocatorGeneratorに制限してすべてを解決しました。

関連する問題