0

OSGiアプリケーションで奇妙な動作を観察しています。基本的に、1つのサービスインターフェイスの実装を提供するいくつかのバンドルがあります。消費するバンドルは、特定のバージョンに一致するこれらのバンドルの1つの実装を使用することになっています。

私は最初に次のようなサービストラッカーのフィルターを使用してすべてのサービスを取得することでこれを達成しようとしています。

serviceTaskTracker = new ServiceTracker(bundleContext, 
bundleContext.createFilter("(objectClass=*ServiceTasks)"), null);
ServiceReference[] serviceReferences = serviceTaskTracker.getServiceReferences();

続いて、結果セットを繰り返し処理します

for (ServiceReference serviceReference : serviceReferences) {
        Bundle currentBundle = serviceReference.getBundle();

        try {
            Version currentVersion = currentBundle.getVersion();
        } catch (Throwable e) {
            System.out.println(e);
            e.printStackTrace();
        }

        if (currentVersion.equals(specifiedVersion)) {
            service = (ServiceTasks) bundleContext.getService(serviceReference);
        }
}

currentBundle.getVersion()を呼び出すとクラッシュし、「そのようなメソッドエラーはありません」と報告されるようになりました。Eclipseのデバッグモードでその行にステップアップし、「currentBundle.getVersion()」を強調表示し、CTRL + Shift + Dを押して実行し、提供するバンドルの期待されるバージョンを取得できるため、これは特に奇妙です。F6を押してもう一度ステップすると、クラッシュします。

currentBundle.getClass()は、getVersion()を呼び出す前に、「(org.eclipse.osgi.framework.internal.core.BundleHost)」を返します。

スタックトレースは次のようになります。

java.lang.NoSuchMethodError:org.osgi.framework.Bundle.getVersion()Lorg / osgi / framework / Version; java.lang.NoSuchMethodError:org.osgi.framework.Bundle.getVersion()Lorg / osgi / framework / Version; de.paas.engine.adapter.activiti.PaasServiceTask.getServiceTaskService(PaasServiceTask.java:69)at de.paas.servicetasks.exampleprocess.SendMailTask​​.paasExecute(SendMailTask​​.java:58)at de.paas.engine.adapter.activiti .PaasServiceTask.execute(PaasServiceTask.java:119)at org.activiti.engine.impl.bpmn.helper.ClassDelegate.execute(ClassDelegate.java:115)at org.activiti.engine.impl.pvm.runtime.AtomicOperationActivityExecute.execute (AtomicOperationActivityExecute.java:44)org.activiti.engine.impl.interceptor.CommandContext.performOperation(CommandContext.java:77)atorg.activiti.engine.impl.persistence.entity。

これはバックグラウンドでのOSGiの魔法が原因だと推測できますか?!どんな助けでも大歓迎です。ありがとうございました!!ヨハネス

4

2 に答える 2

10

このgetVersion()メソッドはBundle、パッケージのバージョン 1.5 org.osgi.framework、つまり OSGi リリース 4.2 で追加されました。OSGi R4.2 に対してコンパイルしたように見えますが、実際にはそれよりも低いバージョンで実行しています。

Import-Packageこの種の問題は、ステートメントでバージョン範囲を使用することで簡単に回避できます。org.osgi.frameworkこの例では、パッケージをバージョン範囲としてインポートする必要があり[1.5,2.0)ます。これにより、バンドルが OSGi フレームワークの以前のバージョンで解決されなくなります。

于 2012-05-24T09:24:36.867 に答える
1

ここで勘を働かせてください: あなたのコードとプラットフォーム コードは、org.osgi.frameworkパッケージがどこから来たのかについて異なる考えを持っていると思います。これは、OSGi API が異なるバンドルからロードされた場合に発生する可能性があり、その結果、クラスは同じ名前で互換性がありません

コンソールを使用して、バンドルがorg.osgi.frameworkパッケージにどのように接続されているかを確認し、Bundle検査を生成するバンドルがどのように接続されているかを確認できます。私の推測では、アプリケーションに埋め込みすぎている可能性があります。これは、Eclipse でのデバッグ中には正しく動作する可能性がありますが、Tomcat での実行中には正しく配線されません (プロジェクトをデプロイする正確な方法によって異なります)。

于 2012-05-24T09:22:05.547 に答える