簡體   English   中英

無法將jar添加到OSGi包中

[英]Unable to add jar to OSGi bundle

又一個愚蠢的問題。 我確信這很容易,但是這已經花了我很多時間而且我沒有讓它工作;(

我寫了一個工作原型來對服務器進行休息調用。 為此,我使用“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 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. 添加一個罐子
  2. 運行應用程序
  3. 查看找不到的類,找到該類所在的jar,將其添加到bundle類路徑中,返回2

但有一件事:澤西罐子已經准備好了OSGi,所以你可以將jersey-client.jar和jersey-core.jar添加到你的taget平台並導入所需的包。

看看你的次要查詢我想你只想知道發生了什么:-)

OSGi 圍繞 JAR創建模塊。 默認情況下,圍柵是不可穿透的,捆綁(jar)之外的類都不可見(能夠從中加載類)到內部的類,而外人無法在bundle中看到任何內容。 優勢應該是顯而易見的:你可以改變內心的喜悅,因為外面都不知道。

然而,在現實生活中,你需要在圍欄中有一些洞才能與他人合作。 在你的情況下,一個bundle試圖加載com.sun.jersey.spi.service.ServiceFinder,但它會進入fence,因為沒有合適的漏洞。

OSGi中的“漏洞”是封裝,這些是共享原子。 您可以在清單中列出這些包。 Import-Package標頭指示您需要從外部世界看到的包,Export-Package標頭定義了包對其他包可見的包(以及在哪個版本下)。

顯然你不想手動計算導入,因為這些已經存在於你的類文件中,因此有一個工具bnd(我是作者)可以從maven,ant,gradle等使用。它需要一個食譜並使用適當的元數據計算生成的包。 bndtools Eclipse插件廣泛支持此工具,這是一個非常好的環境,可以了解有關OSGi和這些問題的更多信息。

先生,在eclipse中你已經添加了不同的包裝。 com.sun.jersey.spi.service.ServiceFinder。 要開始你的服務,你必須開始其他服務。 你捆綁的是依賴的。 就像我有一個jar,它依賴於rxtxcomm_api-2.1.7.jar。 我不得不初始化它,或者你可以說它是真的。 在我服務之前。 請檢查一下。

在OSGi中嵌入jar是一種糟糕的風格。 一般來說,只有在沒有其他辦法的情況下才應該這樣做。 嵌入jar很容易導致類路徑問題,因為包可能來自不同的包。 是否有特殊原因要嵌入罐子? 自版本1.2以來,Jersey已完全准備好OSGi。 有關如何使用它的示例,請參閱文檔

大多數OSGi容器都帶有開箱即用的JAX-RS實現 - 是Jersey或者什么不是。 例如,我們正在使用Apache ServiceMix,它可以方便地提供Apache CXF。

  • 你用的是什么容器?
  • 你真的必須將Jersey與你的應用程序捆綁在一起嗎?

如果您因任何原因需要捆綁Jersey,請提供清單文件的示例。

  • 你考慮過使用Maven-Bundle-Plugin嗎?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM