1

アプリケーションの CPU やメモリなどを監視するために使用されていたレガシー コードがあり、バンドルに変換したいと考えています。今、このバンドルを開始すると、不平を言う

Missing Constraint: Import-Package: com.sun.management; version="0.0.0"

JVM の統計情報にアクセスするために、OperatingSystemMXBean を使用していました。

私の質問は、このクラスを OSGI コンテナー内で使用できるかということです。または、アプリケーションを監視するために他の方法を使用する必要があります。OSGi より前のノードのパフォーマンス数値を取得するために、Web フロントエンドからアプリケーションへの RMI 呼び出しを行っていました。

4

2 に答える 2

2

以下は、これを機能させるために私がしなければならなかったことです。

OSGI を初めて使用したので、システム バンドルの systemProperties 値に com.sun.management を追加する必要がありました。私は maven-pax-plugin を使用しているので、次のプロパティを追加する必要がありました。デフォルトで機能しなかった理由は、私が選択した osgi コンテナーの com.sun.* パッケージがデフォルトでシステム バンドルに含まれていない分点でした。

これは、bundle 0 コマンドを使用してシステム バンドルを調べることで明らかでした。バンドル 0 は常にシステム バンドルであり、これは私にとって新しいものでした。

<param>--sp=com.sun.management</param>

このコマンドを追加した後、システム バンドルには com.sun.management が含まれ、私のバンドルは問題なくデプロイされました。

equinox がデフォルトで systemProperties に com.sun パッケージを含まない理由については、こちらを参照してください。(sun.* パッケージを直接呼び出す Java プログラムは、すべての Java 互換プラットフォームで動作することが保証されているわけではありません。実際、そのようなプログラムは、同じプラットフォームの将来のバージョンでも動作することが保証されていません。)

したがって、com.sun を osgi コンテナーに追加するには 2 つのオプションがあります。

ソリューション A': 拡張バンドル

これらはフラグメントとして機能します。それらは独自のバンドルではなく、ホストに接続されています。拡張バンドルは、フレームワークのオプション部分を提供するためにシステム バンドルにのみ添付される特別な種類のフラグメントです。このメカニズムを使用して、必要なパッケージを宣言するだけの空の拡張機能を作成し、ロードをそのホスティング バンドル (この場合はフレームワーク) に任せることができます。2 番目のオプションの方が実装が早かったため、このルートには行きませんでした。

解決策 B: ブート委任

最終的に私が選んだオプションは、ブート委任でした。これにより、ユーザーは、バンドルが適切なインポートを提供しない場合でも、フレームワークの親クラス ローダーによって常にロードされる「暗黙の」パッケージを作成できます。com.sun.management を含むようにシステム パッケージを設定することで達成しました。

問題全体をより詳細に説明している次の優れたリンクを参照してください。

于 2010-04-14T14:39:10.660 に答える
1

インタラクティブな OSGi セッションでインストールしてみていただけますか? たとえば、この記事
を 参照してください。

osgi> ss

Framework is launched.

id State       Bundle
0 ACTIVE      org.eclipse.osgi_3.4.0.v20080605-1900

osgi>  install file:bundles/FirstBundle-1.0.0.jar
Bundle id is 1

//Try starting 
osgi> start 1
org.osgi.framework.BundleException: The bundle could not be resolved. 
  Reason: Missing Constraint: Import-Package: com.so.samples.osgi.second; 
                                              version="0.0.0"
 at org.eclipse.osgi.framework.internal.core.BundleHost.startWorker
    (BundleHost.java:305)

問題を診断できます。

osgi> diag 1
file:bundles/FirstBundle-1.0.0.jar [1]
  Direct constraints which are unresolved:
    Missing imported package com.so.samples.osgi.second_0.0.0.

そして、jar を取得する場所がわかっている場合は、不足している依存関係をインストールします(これはあなたの質問の核心である可能性が非常に高く、OSGi バンドル内のレガシー jar をラップ プロトコル
のように変換することを除いて、正確な答えはありません)。またはOSGi フレームワークの拡張):

osgi> install file:bundles/SecondBundle-1.0.0.jar
Bundle id is 2
于 2010-04-13T14:13:50.750 に答える