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 中就解决了所有问题。
我正在尝试使用 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 中就解决了所有问题。