0

我在我的 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 魔法引起的?!非常感谢任何帮助。谢谢!!约翰内斯

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 回答