1

さらにばかげた質問です。簡単なことだと思いますが、すでに多くの時間がかかり、うまくいきません;(

サーバーへの残りの呼び出しを行うための作業プロトタイプを作成しました。これを行うには、「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(); でジャージー クライアントを作成するときに classdef not found 例外が発生するという現象が発生します。

エントリー org.eclipse.equinox.event 4 0 2012-11-08 23:14:43.975

!MESSAGE イベント org.osgi.service.event.Event [topic=openhab/command/Hue_Bulb_2] をハンドラー org.openhab.binding.hue.internal.HueBinding@70f5f42b にディスパッチ中に例外が発生しました

!スタック 0

java.lang.NoClassDefFoundError: クラス com.sun.jersey.spi.service.ServiceFinder を初期化できませんでした

com.sun.jersey.api.client.Client.init(Client.java:213) で

com.sun.jersey.api.client.Client.access$000 (Client.java:118) で

com.sun.jersey.api.client.Client$1.f(Client.java:191) で

com.sun.jersey.api.client.Client$1.f(Client.java:187) で

com.sun.jersey.spi.inject.Errors.processWithErrors (Errors.java:193) で

com.sun.jersey.api.client.Client.(Client.java:187) で

com.sun.jersey.api.client.Client.(Client.java:159) で

com.sun.jersey.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.pairBridgeIfNecessary (HueBridge.java:19) で

org.openhab.binding.hue.internal.HueBinding.receiveCommand (HueBinding.java:37) で

org.openhab.core.events.AbstractEventSubscriber.handleEvent (AbstractEventSubscriber.java:62) で

org.eclipse.equinox.internal.event.EventHandlerWrapper.handleEvent (EventHandlerWrapper.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 (ListenerQueue.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(ServletRegistration.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.http.HttpServlet.service(HttpServlet.java:848) で

org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:598)で

org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:486)で

org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:231)で

org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1065)で

org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:413) で

org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:192)で

org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:999) で

org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:117)で

org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:250) で

org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:149) で

org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:111) で

org.eclipse.jetty.server.Server.handle(Server.java:350)で

org.eclipse.jetty.server.AbstractHttpConnection.handleRequest (AbstractHttpConnection.java:454) で

org.eclipse.jetty.server.AbstractHttpConnection.headerComplete (AbstractHttpConnection.java:890) で

org.eclipse.jetty.server.AbstractHttpConnection$RequestHandler.headerComplete (AbstractHttpConnection.java:944) で

org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:630)で

org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:230)で

org.eclipse.jetty.server.AsyncHttpConnection.handle(AsyncHttpConnection.java:77) で

org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:606) で

org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:46) で

org.eclipse.jetty.util.thread.QueuedThreadPool.runJob (QueuedThreadPool.java:603) で

org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:538) で

java.lang.Thread.run(Thread.java:680) で

23:14:43.992 ERROR OSGi[:98] - イベント org.osgi.service.event.Event [topic=openhab/command/Hue_Bulb_2] をハンドラ org.openhab.binding.hue.internal.HueBinding@70f5f42b にディスパッチ中に例外が発生しました

java.lang.NoClassDefFoundError: クラス com.sun.jersey.spi.service.ServiceFinder を初期化できませんでした

com.sun.jersey.api.client.Client.init(Client.java:213) で

com.sun.jersey.api.client.Client.access$000 (Client.java:118) で

com.sun.jersey.api.client.Client$1.f(Client.java:191) で

com.sun.jersey.api.client.Client$1.f(Client.java:187) で

com.sun.jersey.spi.inject.Errors.processWithErrors (Errors.java:193) で

com.sun.jersey.api.client.Client.(Client.java:187) で

com.sun.jersey.api.client.Client.(Client.java:159) で

com.sun.jersey.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.pairBridgeIfNecessary (HueBridge.java:19) で

org.openhab.binding.hue.internal.HueBinding.receiveCommand (HueBinding.java:37) で
4

5 に答える 5

3

jersey-client には依存関係があるため、バンドルのクラスパスに jersey-core を追加する必要もあります。

必要に応じて、他の依存関係を追加する必要がある場合もあります。楽しいとは言えませんが、プロセスはかなり簡単です。

  1. 瓶を追加
  2. アプリを実行する
  3. どのクラスが見つからないかを確認し、そのクラスが存在するjarを見つけ、それをバンドルのクラスパスに追加し、2に戻ります

ただし、Jersey jar は OSGi に対応しているため、jersey-client.jar と jersey-core.jar をターゲット プラットフォームに追加して、必要なパッケージをインポートすることもできます。

于 2012-11-11T12:43:53.753 に答える
1

二次クエリを見ると、何が起こっているのか知りたいだけだと思います:-)

OSGiは JAR をフェンスしてモジュールを作成します。デフォルトでは、フェンスは侵入できず、バンドル (jar) の外側のクラスは内側のクラスから見えず (クラスをロードできる)、部外者はバンドルの内側を何も見ることができません。利点は明らかです。外には何も知られていないので、心の中を喜びに変えることができます。

ただし、実際には、他のユーザーとコラボレーションできるようにするために、フェンスにいくつかの穴が必要です。あなたの場合、バンドルは com.sun.jersey.spi.service.ServiceFinder をロードしようとしますが、適切な穴がないため、フェンスにぶつかります。

OSGi の「穴」はパッケージであり、これらは共有アトムです。これらのパッケージをマニフェストにリストします。Import-Package ヘッダーは、外部から表示する必要があるパッケージを示し、Export-Package ヘッダーは、パッケージが他のバンドルに表示されるパッケージ (およびバージョン) を定義します。

これらはすでにクラスファイルにあるため、手動でインポートを計算したくないことは明らかです。このため、maven、ant、gradle などから使用できるツール bnd (私は作成者です) があります。レシピが必要です。適切なメタデータを使用して結果のバンドルを計算します。このツールは、bndtools Eclipse プラグインで広くサポートされています。これは、OSGi とこれらの問題について詳しく学ぶための非常に優れた環境です。

于 2012-11-12T07:48:46.663 に答える
0

jarを埋め込むことは、OSGiでは悪いスタイルです。通常、これは他に方法がない場合にのみ行う必要があります。パッケージが異なるバンドルからのものである可能性があるため、jarを埋め込むと、クラスパスの問題が発生しやすくなります。瓶を埋め込みたい特別な理由はありますか?ジャージーはバージョン1.2以降完全にOSGiに対応しています。使用方法の例については、ドキュメントを参照してください。

于 2012-11-11T09:04:31.267 に答える
0

ほとんどの OSGi コンテナーには、すぐに使用できる JAX-RS 実装 (Jersey であろうとなかろうと) が付属しています。たとえば、便利な Apache CXF を提供する Apache ServiceMix を使用しています。

  • 容器は何をお使いですか?
  • アプリケーションにJerseyをバンドルする必要は本当にありますか?

何らかの理由で Jersey をバンドルする必要がある場合は、マニフェスト ファイルの例を提供してください。

  • Maven-Bundle-Plugin の使用を検討しましたか?
于 2012-11-11T09:44:09.520 に答える
0

サー、日食では、次のような別のパッケージが追加されました。com.sun.jersey.spi.service.ServiceFinder . あなたのサービスを開始するには、他のサービスを開始する必要があります。バンドルするものは依存しています。rxtxcomm_api-2.1.7.jar に依存する jar があるように。私はそれを初期化しなければなりませんでした。私のサービスの前に。これをチェックしてください。

于 2012-11-10T14:21:04.993 に答える