java - 无法将 jar 添加到 OSGi 包

标签 java jar jersey osgi classpath

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

我编写了一个工作原型(prototype)来对服务器进行休息调用。为此,我使用“jersey-client-1.14.jar”。通过将其添加到 Eclipse 项目类路径中,效果非常好。

现在我尝试在 OSGi 包中做同样的事情。这些是我所做的步骤:

  1. 我在 OSGi bundle 项目中创建了一个/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 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)

最佳答案

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

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

  1. 添加一个 jar
  2. 运行应用
  3. 查看哪个类没有找到,找到该类所在的jar,将其添加到bundle类路径中,返回2

有一件事:Jersey jar 已支持 OSGi,因此您不妨将 jersey-client.jar 和 jersey-core.jar 添加到您的 taget 平台并导入所需的包。

关于java - 无法将 jar 添加到 OSGi 包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13322483/

相关文章:

java - 如何使用命令提示符在两个 jar 文件之间创建管道?

java - jar 文件系统中的目录名称与常规文件系统不同

java - Jersey:获取方法的 URL

java - 在 ArrayList 中搜索对象

java - 识别调用 Web 服务的用户

java - 如何打印返回数组的方法?

java - 查看解压.jar文件得到的.ser文件

java - 为什么 Java ArrayList 类为添加返回一个 boolean 值?

java - HTTP 状态 500 - servlet jersey-serlvet 的 Servlet.init() 抛出异常?

java - 在实现 exceptionmapper 的 Jersey 中以编程方式注册提供者