OSGI REST“Jersey尚未准备好” - 找不到HK2 ServiceLocatorGenerator

时间:2017-05-01 04:11:47

标签: jersey osgi apache-felix bndtools

我正在尝试使用osgi-jax-rs-connector,jersey和bndtools来使用简单的osgi rest端点。

我将publisher-5.3.1.jar包和jersey-all-2.22.2.jar包(均由osgi-jax-rs-connector提供)包装到我自己的独立包中。我有另一个我自己的捆绑包,它使用注释提供其余的端点。

我可以使用bndrun文件在Apache Felix中解析并运行它,并在gogo shell中验证我自己的rest端点是否已注册为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/src=@libsrc/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是一个实现ServiceLocatorGenerator接口的类,该接口包含在活动的jersey-all包jar文件中,以及我生成的包装它的包装包jar。

1 个答案:

答案 0 :(得分:0)

HK2 ServiceLocatorGenerator错误指的是jersey-all jar包含几个与jdk中类java.util.ServiceLoader简单服务提供库相关的提供者配置文件(参见https://docs.oracle.com/javase/8/docs/api/java/util/ServiceLoader.html)。

这些服务最初存在于hk2-locator jar文件中,该文件是Jersey依赖项。

通过让我的包装包中包含来自jersey-all.jar中的META-INF / services / org.glassfish.hk2.extension.ServiceLocatorGenerator的文件来解决这个问题。完成此任务的bnd声明是

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

这完全解决了这个问题,并使我的休息端点成功运行。

有趣的是,当我让bnd声明其他META-INF / services / *文件包含在生成的包中时,结果是多了几个错误,但只是将它限制在ServiceLocatorGenerator中解决了所有问题。