我在我的 OSGi 应用程序中观察到奇怪的行为。我基本上有几个包提供了一个服务接口的实现。消费包应该使用与特定版本匹配的这些包之一的实现。
我一直在尝试通过首先使用服务跟踪器上的过滤器检索所有服务来实现这一点,如下所示:
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) 在 de.paas.servicetasks.exampleprocess.SendMailTask.paasExecute(SendMailTask.java:58) 在 de.paas.engine.adapter.activiti .PaasServiceTask.execute(PaasServiceTask.java:119) 在 org.activiti.engine.impl.bpmn.helper.ClassDelegate.execute(ClassDelegate.java:115) 在 org.activiti.engine.impl.pvm.runtime.AtomicOperationActivityExecute.execute (AtomicOperationActivityExecute.java:44) 在 org.activiti.engine.impl.interceptor.CommandContext.performOperation(CommandContext.java:77) 在 org.activiti.engine.impl.persistence.entity。
我只能猜测这是由后台的 OSGi 魔法引起的?!非常感谢任何帮助。谢谢!!约翰内斯