无法将jar添加到OSGi包中

时间:2012-11-10 13:31:58

标签: java jar jersey osgi classpath

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

我写了一个工作原型来对服务器进行休息调用。为此,我使用“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工作区中,我没有编译错误。
  6. 在运行时,我遇到了在使用Client.create()创建jersey客户端时遇到classdef not found异常的现象;

    !ENTRY org.eclipse.equinox.event 4 0 2012-11-08 23:14:43.975
    
    !MESSAGE Exception while dispatching event org.osgi.service.event.Event [topic=openhab/command/Hue_Bulb_2] to handler org.openhab.binding.hue.internal.HueBinding@70f5f42b
    
    !STACK 0
    
    java.lang.NoClassDefFoundError: Could not initialize class com.sun.jersey.spi.service.ServiceFinder
    
    at com.sun.jersey.api.client.Client.init(Client.java:213)
    
    at com.sun.jersey.api.client.Client.access$000(Client.java:118)
    
    at com.sun.jersey.api.client.Client$1.f(Client.java:191)
    
    at com.sun.jersey.api.client.Client$1.f(Client.java:187)
    
    at com.sun.jersey.spi.inject.Errors.processWithErrors(Errors.java:193)
    
    at com.sun.jersey.api.client.Client.(Client.java:187)
    
    at com.sun.jersey.api.client.Client.(Client.java:159)
    
    at com.sun.jersey.api.client.Client.create(Client.java:669)
    
    at org.openhab.binding.hue.internal.bridge.HueBridge.getSettingsJson(HueBridge.java:64)
    
    at org.openhab.binding.hue.internal.bridge.HueBridge.pairBridgeIfNecessary(HueBridge.java:19)
    
    at org.openhab.binding.hue.internal.HueBinding.receiveCommand(HueBinding.java:37)
    
    at org.openhab.core.events.AbstractEventSubscriber.handleEvent(AbstractEventSubscriber.java:62)
    
    at org.eclipse.equinox.internal.event.EventHandlerWrapper.handleEvent(EventHandlerWrapper.java:197)
    
    at org.eclipse.equinox.internal.event.EventHandlerTracker.dispatchEvent(EventHandlerTracker.java:197)
    
    at org.eclipse.equinox.internal.event.EventHandlerTracker.dispatchEvent(EventHandlerTracker.java:1)
    
    at org.eclipse.osgi.framework.eventmgr.EventManager.dispatchEvent(EventManager.java:230)
    
    at org.eclipse.osgi.framework.eventmgr.ListenerQueue.dispatchEventSynchronous(ListenerQueue.java:148)
    
    at org.eclipse.equinox.internal.event.EventAdminImpl.dispatchEvent(EventAdminImpl.java:135)
    
    at org.eclipse.equinox.internal.event.EventAdminImpl.sendEvent(EventAdminImpl.java:78)
    
    at org.eclipse.equinox.internal.event.EventComponent.sendEvent(EventComponent.java:39)
    
    at org.openhab.core.internal.events.EventPublisherImpl.sendCommand(EventPublisherImpl.java:76)
    
    at org.openhab.ui.webapp.internal.servlet.CmdServlet.service(CmdServlet.java:115)
    
    at org.eclipse.equinox.http.servlet.internal.ServletRegistration.service(ServletRegistration.java:61)
    
    at org.eclipse.equinox.http.servlet.internal.ProxyServlet.processAlias(ProxyServlet.java:128)
    
    at org.eclipse.equinox.http.servlet.internal.ProxyServlet.service(ProxyServlet.java:60)
    
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:848)
    
    at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:598)
    
    at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:486)
    
    at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:231)
    
    at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1065)
    
    at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:413)
    
    at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:192)
    
    at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:999)
    
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:117)
    
    at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:250)
    
    at org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:149)
    
    at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:111)
    
    at org.eclipse.jetty.server.Server.handle(Server.java:350)
    
    at org.eclipse.jetty.server.AbstractHttpConnection.handleRequest(AbstractHttpConnection.java:454)
    
    at org.eclipse.jetty.server.AbstractHttpConnection.headerComplete(AbstractHttpConnection.java:890)
    
    at org.eclipse.jetty.server.AbstractHttpConnection$RequestHandler.headerComplete(AbstractHttpConnection.java:944)
    
    at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:630)
    
    at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:230)
    
    at org.eclipse.jetty.server.AsyncHttpConnection.handle(AsyncHttpConnection.java:77)
    
    at org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:606)
    
    at org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:46)
    
    at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:603)
    
    at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:538)
    
    at java.lang.Thread.run(Thread.java:680)
    
    23:14:43.992 ERROR OSGi[:98] - Exception while dispatching event org.osgi.service.event.Event [topic=openhab/command/Hue_Bulb_2] to handler org.openhab.binding.hue.internal.HueBinding@70f5f42b
    
    java.lang.NoClassDefFoundError: Could not initialize class com.sun.jersey.spi.service.ServiceFinder
    
    at com.sun.jersey.api.client.Client.init(Client.java:213)
    
    at com.sun.jersey.api.client.Client.access$000(Client.java:118)
    
    at com.sun.jersey.api.client.Client$1.f(Client.java:191)
    
    at com.sun.jersey.api.client.Client$1.f(Client.java:187)
    
    at com.sun.jersey.spi.inject.Errors.processWithErrors(Errors.java:193)
    
    at com.sun.jersey.api.client.Client.(Client.java:187)
    
    at com.sun.jersey.api.client.Client.(Client.java:159)
    
    at com.sun.jersey.api.client.Client.create(Client.java:669)
    
    at org.openhab.binding.hue.internal.bridge.HueBridge.getSettingsJson(HueBridge.java:64)
    
    at org.openhab.binding.hue.internal.bridge.HueBridge.pairBridgeIfNecessary(HueBridge.java:19)
    
    at org.openhab.binding.hue.internal.HueBinding.receiveCommand(HueBinding.java:37)
    

5 个答案:

答案 0 :(得分:3)

你还需要将jersey-core添加到bundle的类路径中,因为jersey-client将它作为依赖项。

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

  1. 添加一个罐子
  2. 运行应用
  3. 查看找不到的类,找到该类所在的jar,将其添加到bundle classpath,返回2
  4. 但有一件事:泽西罐子已经准备好了OSGi,所以你可以将jersey-client.jar和jersey-core.jar添加到你的taget平台并导入所需的包。

答案 1 :(得分:1)

查看您的辅助查询我认为您只想知道发生了什么: - )

OSGi fences 用于创建模块的JAR。默认情况下,围栅是不可穿透的,捆绑(jar)之外的类都不可见(能够从中加载类)到内部的类,而外人无法在bundle中看到任何内容。优势应该是显而易见的:你可以改变内心的喜悦,因为外面都不知道。

然而,在现实生活中,你需要在围栏中有一些洞才能与他人合作。在你的情况下,一个bundle试图加载com.sun.jersey.spi.service.ServiceFinder,但它会运行到fence中,因为没有合适的漏洞。

OSGi中的“漏洞”是包,这些是共享原子。您可以在清单中列出这些包。 Import-Package标头指示您需要从外部世界看到的包,Export-Package标头定义了包对其他包可见的包(以及在什么版本下)。

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

答案 2 :(得分:0)

先生,在eclipse中你已经添加了不同的包。 com.sun.jersey.spi.service.ServiceFinder。要开始你的服务,你必须开始其他服务。你捆绑的是依赖的。 就像我有一个jar,它依赖于rxtxcomm_api-2.1.7.jar。 我不得不初始化它,或者你可以说它是真的。在我服务之前。请检查一下。

答案 3 :(得分:0)

在OSGi中嵌入jar是一种糟糕的风格。一般来说,只有在没有其他办法的情况下才应该这样做。嵌入jar很容易导致类路径问题,因为包可能来自不同的包。是否有特殊原因要嵌入罐子? 自版本1.2以来,Jersey已完全准备好OSGi。请参阅documentation for examples如何使用它。

答案 4 :(得分:0)

大多数OSGi容器都带有开箱即用的JAX-RS实现 - 是Jersey或者什么不是。例如,我们正在使用Apache ServiceMix,它可以方便地提供Apache CXF。

  • 你在用什么容器?
  • 你真的必须将Jersey与你的应用程序捆绑在一起吗?

如果您因任何原因需要捆绑泽西岛,请提供清单文件的示例。

  • 你考虑过使用Maven-Bundle-Plugin吗?