OSGI REST "Jersey is not ready yet" - 找不到 HK2 ServiceLocatorGenerator 的默认实现

OSGI REST "Jersey is not ready yet" - Cannot find a default implementation of the HK2 ServiceLocatorGenerator

我正在尝试使用 osgi-jax-rs-connector、jersey 和 bndtools 获得一个简单的 osgi rest 端点。

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

我能够使用 bnd运行 文件在 Apache Felix 中解析并 运行 它,并在 gogo shell 中验证我自己的休息端点已注册为 osgi com.eclipsesource.jaxrs.publisher.

使用的服务

应用程序启动时记录:

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:// 

我打包的 jersey/publisher 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 是一个 class,它实现了 ServiceLocatorGenerator 接口,该接口包含在活动的 jersey-all bundle jar 文件以及我生成的包装中包装它的 bundle jar。

HK2 ServiceLocatorGenerator 错误是指 jersey-all jar 包含几个与 class java.util.ServiceLoader 简单服务提供库相关的提供者配置文件 jdk(参见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 中就解决了所有问题。