【问题标题】:OSGI REST "Jersey is not ready yet" - Cannot find a default implementation of the HK2 ServiceLocatorGeneratorOSGI REST“泽西还没有准备好” - 找不到 HK2 ServiceLocatorGenerator 的默认实现
【发布时间】:2017-09-28 13:49:33
【问题描述】:

我正在尝试使用 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 中。

【问题讨论】:

    标签: jersey osgi apache-felix bndtools


    【解决方案1】:

    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 解决了所有问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-29
      • 2017-01-26
      • 2020-01-20
      • 1970-01-01
      • 1970-01-01
      • 2017-03-27
      相关资源
      最近更新 更多