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の魔法が原因だと推測できますか?!どんな助けでも大歓迎です。ありがとうございました!!ヨハネス