无法将jar添加到OSGi捆绑包中


还有一个愚蠢的问题。我确信这很容易,但这已经花了我很多时间,而且我没有让它发挥作用;(

我已经编写了一个工作原型来对服务器进行rest调用。为了做到这一点,我使用了"jersey-client-1.14.jar"。通过将它添加到eclipse项目类路径中,效果非常好。

现在我正试图在OSGi捆绑包中做同样的事情。这些是我做的步骤:

  1. 我在OSGi捆绑包项目中创建了一个/lib文件夹
  2. 在该文件夹中添加了jersey-client-1.14.jar
  3. 在类路径的MANIFEST.MF中添加了jar:Bundle classpath:。,lib/jersey-client-1.14.jar
  4. 检查它是否也正确添加到项目类路径中
  5. 在Eclipse工作区中,我没有编译错误

在运行时,当使用client.create()创建jersey客户端时,我会出现classdef未找到异常的现象;

!ENTRY org.eclipse.eequinox.event 4 0 2012-11-08 23:14:43.975!将事件org.osgi.service.event.event[主题=openhab/command/Hue_Bulb_2]发送到处理程序时出现MESSAGE异常org.openhab.binding.hue.internal.HueBinding@70f5f42b!堆栈0java.lang.NoClassDefFoundError:无法初始化类com.sun.jses.spi.service.ServiceFinder网址:com.sun.jersy.api.client.client.init(client.java:213)网址:com.sun.jersy.api.client.client.access$000(client.java:118)网址:com.sun.jersy.api.client.client$1.f(client.java:191)网址:com.sun.jersy.api.client.client$1.f(client.java:187)网址:com.sun.jersy.spi.inject.Errors.processWithErrors(Errors.java:193)网址:com.sun.jersy.api.client.client.(client.java:187)网址:com.sun.jersy.api.client.client.(client.java:159)网址:com.sun.jersy.api.client.client.create(client.java:669)网址:org.openhab.binding.hue.internal.bridge.HueBridge.getSettingsJson(HueBridge.java:64)网址:org.openhab.binding.hue.internal.bridge.HueBridge.pairBridgeIfNenecessary(HueBridge.java:19)网址:org.openhab.binding.hue.internal.HueBinding.rereceiveCommand(HueBinding.java:37)网址:org.openhab.core.events.AbstractEventSubscriber.handleEvent(AbstractEventSubscriber.java:62)位于org.eclipse.equinox.internal.event.EventHandlerWrapper.handleEvent(EventHandlerWrappr.java:197)位于org.eclipse.equinox.internal.event.EventHandlerTracker.dispatchEvent(EventHandlerTracker.java:197)位于org.eclipse.equinox.internal.event.EventHandlerTracker.dispatchEvent(EventHandlerTracker.java:1)网址:org.eclipse.osgi.framework.eventmgr.EventManager.dispatchEvent(EventManager.java:230)网址:org.eclipse.osgi.framework.eventmgr.ListenerQueue.dispatchEventSynchronous(ListerQueue.java:148)位于org.eclipse.equinox.internal.event.EventAdminImpl.dispatchEvent(EventAdminImpl.java:135)位于org.eclipse.equinox.internal.event.EventAdminImpl.sendEvent(EventAdminImpl.java:78)位于org.eclipse.equinox.internal.event.EventComponent.sendEvent(EventComponent.java:39)位于org.openhab.core.internal.events.EventPublisherImpl.sendCommand(EventPublisherImpl.java:76)网址:org.openhab.ui.webapp.internal.servlet.CmdServlet.service(CmdServlet.java:115)网址:org.eclipse.equinox.http.servlet.internal.ServletRegistration.service(servlet注册.java:61)网址:org.eclipse.equinox.http.servlet.internal.ProxyServlet.processAlias(ProxyServlet.java:128)网址:org.eclipse.equinox.http.servlet.internal.ProxyServlet.service(ProxyServlet.java:60)位于javax.servlet.httpHttpServlet.service(HttpServlet.java:848)网址:org.eclipse.japty.servlet.ServletHolder.handle(ServletHolder.java:598)网址:org.eclipse.japty.servlet.ServletHandler.doHandle(ServletHandler.java:486)网址:org.eclipse.jjetty.server.session.SessionHandler.doHandle(SessionHandler.java:231)网址:org.eclipse.jjetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1065)网址:org.eclipse.japty.servlet.ServletHandler.doScope(ServletHandler.java:413)位于org.eclipse.jjetty.server.session.SessionHandler.doScope(SessionHandler.java:192)网址:org.eclipse.jjetty.server.handler.ContextHandler.doScope(ContextHandler.java:999)网址:org.eclipse.jjetty.server.handler.ScopedHandler.handle(ScopedHandler.java:117)位于org.eclipse.jjetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:250)网址:org.eclipse.jjetty.server.handler.HandlerCollection.handle(HandlerCollection.java:149)网址:org.eclipse.jjetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:111)网址:org.eclipse.jjetty.server.handle(server.java:350)网址:org.eclipse.jjetty.server.AbstractHttpConnection.handleRequest(AbstractHttpConnection.java:454)网址:org.eclipse.jjetty.server.AbstractHttpConnection.headerComplete(AbstractHttpConnection.java:890)网址:org.eclipse.jjetty.server.AbstractHttpConnection$RequestHandler.headerComplete(AbstractHttpConnection.java:944)网址:org.eclipse.jjetty.HttpParser.parseNext(HttpParser.java:630)网址:org.eclipse.japty.http.HttpParser.parseAvailable(HttpParser.java:230)位于org.eclipse.jjetty.server.AncHttpConnection.handle(AsyncHttpConnection.java:77)网址:org.eclipse.jjetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:606)网址:org.eclipse.jjetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:46)位于org.eclipse.jjetty.util.thread.QueuedThreadPool.runJob(QueuedTthreadPool.java:603)网址:org.eclipse.jjetty.util.thread.QueuedThreadPool$3.run(QueuedTthreadPool.java:538)位于java.lang.Thread.run(Thread.java:680)23:14:43.992错误OSGi[:98]-将事件org.OSGi.service.event.event[topic=openhab/command/Hue_Bulb_2]发送到处理程序时发生异常org.openhab.binding.hue.internal.HueBinding@70f5f42bjava.lang.NoClassDefFoundError:无法初始化类com.sun.jses.spi.service.ServiceFinder网址:com.sun.jersy.api.client.client.init(client.java:213)网址:com.sun.jersy.api.client.client.access$000(client.java:118)网址:com.sun.jersy.api.client.client$1.f(client.java:191)网址:com.sun.jersy.api.client.client$1.f(client.java:187)网址:com.sun.jersy.spi.inject.Errors.processWithErrors(Errors.java:193)网址:com.sun.jersy.api.client.client.(client.java:187)网址:com.sun.jersy.api.client.client.(client.java:159)网址:com.sun.jersy.api.client.client.create(client.java:669)网址:org.openhab.binding.hue.internal.bridge.HueBridge.getSettingsJson(HueBridge.java:64)网址:org.openhab.binding.hue.internal.bridge.HueBridge.pairBridgeIfNenecessary(HueBridge.java:19)位于org.openhab.binding.hue.internal.HueBinding.rereceiveCommand(HueBinding.java:37)

您还需要将jersey核心添加到捆绑包的类路径中,因为jersey客户端将其作为依赖项。

如果需要,您可能还需要添加其他依赖项。这个过程即使不愉快,也相当容易:

  1. 添加一个罐子
  2. 运行应用程序
  3. 查看未找到的类,找到该类所在的jar,将其添加到bundle类路径中,返回2

但有一点:Jersey jar已经准备好了OSGi,所以您还可以将Jersey-client.jar和Jersey-core.jar添加到您的taget平台中,并导入所需的包。

查看您的二次查询,我想您只想知道发生了什么:-)

OSGi围栏JAR来创建模块。默认情况下,围栏是不可穿透的,bundle(jar)外部的类对内部的类都不可见(能够从中加载类),外部人员看不到bundle内部的任何内容。优点应该是显而易见的:你可以改变内心的喜悦,因为外面什么都不知道。

然而,在现实生活中,你需要在围栏上打一些洞才能与他人合作。在您的案例中,一个bundle试图加载com.sun.jersey.spi.service.ServiceFinder,但由于没有合适的洞,它遇到了障碍。

OSGi中的"漏洞"是包,它们是共享的原子。您在清单中列出了这些包。Import Package标头指示您需要从外部看到的程序包,Export Package标头定义了哪些程序包(以及在哪个版本下)对其他捆绑包可见。

显然,你不想手动计算导入,因为这些导入已经在你的类文件中了,因此有一个工具bnd(我是作者)可以从maven、ant、gradle等中使用。它需要一个配方,并使用适当的元数据计算结果包。bndtools Eclipse插件广泛支持该工具,这是一个非常好的环境,可以了解更多关于OSGi和这些问题的信息。

Sir,在eclipse中,您添加了不同的类似包的内容。com.sun.jsersey.spi.service.ServiceFinder。要启动您的服务,您必须启动其他服务。你捆绑的是依赖的。就像我有一个jar,它依赖于rxxcomm_api-2.1.7.jar。我必须初始化它,或者你可以说初始化。在我服务之前。请检查一下。

嵌入jar在OSGi中是一种糟糕的风格。一般来说,只有在没有其他方法的情况下,你才应该这样做。嵌入jar很容易导致类路径问题,因为包可能来自不同的bundle。你想嵌入这个罐子有什么特殊的原因吗?Jersey从1.2版本开始就完全支持OSGi。有关如何使用的示例,请参阅文档

大多数OSGi容器都附带了开箱即用的JAX-RS实现——无论是Jersey还是其他什么。例如,我们使用的是ApacheServiceMix,它方便地提供了ApacheCXF。

  • 您使用的是什么容器
  • 你真的必须把球衣和你的申请捆绑在一起吗

如果您出于任何原因需要捆绑Jersey,请提供您的清单文件示例。

  • 您是否考虑过使用Maven Bundle插件

最新更新