我在我的OSGi应用程序中观察到奇怪的行为.我基本上有几个包提供一个服务接口的实现.消费捆绑包应该使用与特定版本匹配的其中一个捆绑包的实现.
我一直试图通过首先使用服务跟踪器上的过滤器检索所有服务来实现这一目标,如下所示:
serviceTaskTracker = new ServiceTracker(bundleContext,
bundleContext.createFilter("(objectClass=*ServiceTasks)"), null);
ServiceReference[] serviceReferences = serviceTaskTracker.getServiceReferences();
Run Code Online (Sandbox Code Playgroud)
随后,我在迭代结果集
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);
}
}
Run Code Online (Sandbox Code Playgroud)
现在它在调用currentBundle.getVersion()时报告"没有这样的方法错误"时崩溃了.这对我来说特别奇怪,因为我可以在Eclipse的调试模式中升级到那一行,突出显示"currentBundle.getVersion()",按CTRL + Shift + D执行它并获得提供包的预期版本.按F6再一步,它会崩溃.
currentBundle.getClass()在我调用getVersion()之前返回"(org.eclipse.osgi.framework.internal.core.BundleHost)".
stacktrace看起来像这样:
java.lang.NoSuchMethodError:org.osgi.framework.Bundle.getVersion()Lorg/osgi/framework/Version; java.lang.NoSuchMethodError:org.osgi.framework.Bundle.getVersion()Lorg/osgi/framework/Version; at de.paas.engine.adapter.activit.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)org.activiti.engine.impl.bpmn.helper.ClassDelegate.execute(ClassDelegate.java:115)atg.activiti.engine.impl.pvm.runtime.AtomicOperationActivityExecute.execute (AtomicOperationActivityExecute.java:44)org.activiti.engine.impl.interctor.CommandContext.performOperation(CommandContext.java:77)org.activiti.engine.impl.persistence.entity.ExecutionEntity.performOperationSync(ExecutionEntity.java:530) )org.activiti.engine.impl.persistence.entity.ExecutionEntity.performOperation(ExecutionEntity.java:525)org.activiti.engine.pvm.runtime.AtomicOperationTransitionNotifyListenerStart.eventNotificationsCompleted(AtomicOperationTransitionNotifyListenerStart.java:52)at org. activiti.engine.impl.pvm.runtime.Abstrac orE.activiti.engine.impl.permpl上的orE.activiti.engine.impl.interceptor.CommandContext.performOperation(CommandContext.java:77)中的tEventAtomicOperation.execute(AbstractEventAtomicOperation.java:56).ExecutionEntity.performOperationSync(ExecutionEntity. java:530)org.activiti.engine.impl.persistence.entity.ExecutionEntity.performOperation(ExecutionEntity.java:525)at org.activiti.engine.impl.pvm.runtime.AbstractEventAtomicOperation.execute(AbstractEventAtomicOperation.java:49)在org.activiti.engine的org.activiti.engine.impl.interceptor.Command.permplOperation(CommandContext.java:77)org.activiti.engine.impl.persistence.entity.ExecutionEntity.performOperationSync(ExecutionEntity.java:530) org.activiti.engine.impl.interceptor上的org.activiti.engine.impl.pvm.runtime.AtomicOperationTransitionCreateScope.execute(AtomicOperationTransitionCreateScope.java:49)中的.impl.persistence.entity.ExecutionEntity.performOperation(ExecutionEntity.java:525) .CommandContext.perform 操作(CommandContext.java:77)org.activiti.engine.impl.persistence.entity.ExecutionEntity.performOperationSync(ExecutionEntity.java:530)org.activiti.engine.impl.persistence.entity.ExecutionEntity.performOperation(ExecutionEntity. java:525)org.activiti.engine.impl.pvm.runtime.AtomicOperationTransitionNotifyListenerTake.execute(AtomicOperationTransitionNotifyListenerTake.java:65)org.activiti.engine.impl.interceptor.CommandContext.performOperation(CommandContext.java:77)at org .activiti.engine.impl.persistence.entity.ExecutionEntity.performOperationSync(ExecutionEntity.java:530)在org.activiti.engine.impl.persistence.entity.ExecutionEntity.performOperation(ExecutionEntity.java:525)在org.activiti.engine位于org.activiti.engine.impl.persistence.entity的org.activiti.engine.impl.interceptor.CommandContext.performOperation(CommandContext.java:77)的.impl.pvm.runtime.AtomicOperationTransitionDestroyScope.execute(AtomicOperationTransitionDestroyScope.java:115) .ExecutionEntity.performOperationSync(ExecutionEntity.java:530)在org.activiti.engine.impl.persistence.entity.ExecutionEntity.performOperation(ExecutionEntity.java:525)在org.activiti.engine.impl.pvm.runtime.AtomicOperationTransitionNotifyListenerEnd.eventNotificationsCompleted(AtomicOperationTransitionNotifyListenerEnd. java:36)org.activiti.engine.impl.pvm.runtime.AbstractEventAtomicOperation.execute(AbstractEventAtomicOperation.java:56)org.activiti.engine.impl.interceptor.CommandContext.performOperation(CommandContext.java:77)at org .activiti.engine.impl.persistence.entity.ExecutionEntity.performOperationSync(ExecutionEntity.java:530)在org.activiti.engine.impl.persistence.entity.ExecutionEntity.performOperation(ExecutionEntity.java:525)在org.activiti.engine位于org.activiti.engine.impl.persistence.entity的org.activiti.engine.impl.interceptor.CommandContext.performOperation(CommandContext.java:77)的.impl.pvm.runtime.AbstractEventAtomicOperation.execute(AbstractEventAtomicOperation.java:49)位于org.activiti.engine.impl.persistence.entity.ExecutionEntity.take的org.activiti.engine.impl.persistence.entity.ExecutionEntity.performOperation(ExecutionEntity.java:525)的.ExecutionEntity.performOperationSync(ExecutionEntity.java:530) (ExecutionEntity.java:365)org.activiti.engine.bpmn.behavior.ExclusiveGatewayActivityBehavior.leave(ExclusiveGatewayActivityBehavior.java:74)at org.activiti.engine.impl.bpmn.behavior.FlowNodeActivityBehavior.execute(FlowNodeActivityBehavior.java) :36)atg.activiti.engine.imp.pvm.runtime.AtomicOperationActivityExecute.execute(AtomicOperationActivityExecute.java:44)org.activiti.engine.impl.interceptor.CommandContext.performOperation(CommandContext.java:77)at org.在org.activiti.engine的org.activiti.engine.impl.persistence.entity.ExecutionEntity.performOperation(ExecutionEntity.java:525)上的activiti.engine.impl.persistence.entity.ExecutionEntity.performOperationSync(ExecutionEntity.java:530). impl.pvm.runtime.AtomicOperationTransitionNotifyLi stenerStart.eventNotificationsCompleted(AtomicOperationTransitionNotifyListenerStart.java:52)org.activiti.impl.pvm.runtime.AbstractEventAtomicOperation.execute(AbstractEventAtomicOperation.java:56)at org.activiti.engine.impl.interceptor.CommandContext.performOperation(CommandContext. java:77)org.activiti.engine.impl.persistence.entity.ExecutionEntity.performOperationSync(ExecutionEntity.java:530)at org.activiti.engine.impl.persistence.entity.ExecutionEntity.performOperation(ExecutionEntity.java:525)在Org.activiti.engine的org.activiti.impl.pvm.runtime.AbstractEventAtomicOperation.execute(AbstractEventAtomicOperation.java:49)org.activiti.engine.impl.interceptor.CommandContext.performOperation(CommandContext.java:77) .impl.persistence.entity.ExecutionEntity.performOperationSync(ExecutionEntity.java:530)在org.activiti.engine.impl.persistence.entity.ExecutionEntity.performOperation(ExecutionEntity.java:525)在org.activiti.engine.impl.pvm .runtime.AtomicOperat ionTransitionCreateScope.execute(AtomicOperationTransitionCreateScope.java:49)org.activiti.engine.impl.interctor.CommandContext.performOperation(CommandContext.java:77)at org.activiti.engine.impl.persistence.entity.ExecutionEntity.performOperationSync(ExecutionEntity. java:530)org.activiti.engine.impl.persistence.entity.ExecutionEntity.performOperation(ExecutionEntity.java:525)at org.activiti.engine.impl.pvm.runtime.AtomicOperationTransitionNotifyListenerTake.execute(AtomicOperationTransitionNotifyListenerTake.java:65)在org.activiti.engine的org.activiti.engine.impl.interceptor.Command.permplOperation(CommandContext.java:77)org.activiti.engine.impl.persistence.entity.ExecutionEntity.performOperationSync(ExecutionEntity.java:530) org.activiti.en上的org.activiti.engine.impl.pvm.runtime.AtomicOperationTransitionDestroyScope.execute(AtomicOperationTransitionDestroyScope.java:115)中的.impl.persistence.entity.ExecutionEntity.performOperation(ExecutionEntity.java:525)位于org.activiti.engine.impl.persistence的org.activiti.engine.impl.persistence.entity.ExecutionEntity.performOperationSync(ExecutionEntity.java:530)中的gine.impl.interceptor.CommandContext.performOperation(CommandContext.java:77). entity.ExecutionEntity.performOperation(ExecutionEntity.java:525)位于org.activiti.engine.impl.pvm.runtime.AbstractEventAtomicOperation的org.activiti.engine.impl.pvm.runtime.AtomicOperationTransitionNotifyListenerEnd.eventNotificationsCompleted(AtomicOperationTransitionNotifyListenerEnd.java:36).执行(AbstractEventAtomicOperation.java:56)org.activiti.engine.impl.interceptor.CommandContext.performOperation(CommandContext.java:77)org.activiti.engine.impl.persistence.entity.ExecutionEntity.performOperationSync(ExecutionEntity.java: 530)在org.activiti.engine.impl.persistence.entity.ExecutionEntity.performOperation(ExecutionEntity.java:525)在org.activiti.engine.impl.pvm.runtime.AbstractEventAtomicOperation.execute(AbstractEventAtomicOperation.java:49)一 在org.activiti.engine的org.activiti.engine.impl.persistence.entity.ExecutionEntity.performOperationSync(ExecutionEntity.java:530)中的org.activiti.engine.impl.interceptor.CommandContext.performOperation(CommandContext.java:77)位于org.activiti.engine.impl.bpmn的org.activiti.engine.impl.persistence.entity.ExecutionEntity.take(ExecutionEntity.java:365)的.impl.persistence.entity.ExecutionEntity.performOperation(ExecutionEntity.java:525) .behavior.BpmnActivityBehavior.performOutgoingBehavior(BpmnActivityBehavior.java:102)atg.activiti.impl.bpmn.behavior.BpmnActivityBehavior.performDefaultOutgoingBehavior(BpmnActivityBehavior.java:51)at org.activiti.engine.impl.bpmn.behavior.FlowNodeActivityBehavior .leave(FlowNodeActivityBehavior.java:44)org.activiti.engine.bpmn.behavior.AbstractBpmnActivityBehavior.leave(AbstractBpmnActivityBehavior.java:47)at org.activiti.engine.impl.bpmn.behavior.UserTaskActivityBehavior.signal(UserTaskActivityBehavior) .java:92)在org.activiti.engine.位于org.activiti.engine.impl.cmd的org.activiti.engine.impl.persistence.entity.TaskEntity.complete(TaskEntity.java:149)中的impl.persistence.entity.ExecutionEntity.signal(ExecutionEntity.java:348).来自org.activiti.engine.impl.inmpl.interren.intermand.CommandContextInterceptor.exe的org.activiti.engine.impl.interceptor.CommandExecutorImpl.execute(CommandExecutorImpl.java:24)中的SubmitTaskFormCmd.execute(SubmitTaskFormCmd.java:74)(CommandContextInterceptor.java: 42)atg.activiti.engine.impl.interceptor.LogInterceptor.execute(LogInterceptor.java:33)at or.deas.engine.adapter atg.activiti.engine.impl.FormServiceImpl.submitTaskFormData(FormServiceImpl.java:68)at de.paas.engine.adapter .activiti.ActivitiEngine.submit(ActivitiEngine.java:116)位于de.paas.engine.core.ProcessEngineModule.submit(ProcessEngineModule.java:119)de.paas.handler.ProcessHandler.post(ProcessHandler.java:223)at at de.paas.dispatcher.PortalDispatcher.dispatch(PortalDispatcher.java:77)at de.paas.dispatcher.PortalDispatcher.doPost(PortalDispatcher.java:106)at de.paas.controller.FrontController.startService(FrontController.java:87)at de.paas.controller.FrontController.doFilter(FrontController.java:160)at de.paas.filter.core.PaasChain.doFilter(PaasChain.java) :28)在de.paas.filter.PaasMessageFilter.doFilter(PaasMessageFilter.java:53)在de.paas.filter.core.PaasChain.doFilter(PaasChain.java:28)在de.paas.filter.PaasAuthorisationFilter.doFilter( PaasAuthorisationFilter.java:31)de.paas.filter.core.PaasChain.doFilter(PaasChain.java:28)at de.paas.filter.PaasSessionFilter.doFilter(PaasSessionFilter.java:39)at de.paas.filter.core .PaasChain.doFilter(PaasChain.java:28)de.paas.filter.PaasCallExceptionFilter.doFilter(PaasCallExceptionFilter.java:44)at de.paas.filter.core.PaasChain.doFilter(PaasChain.java:28)at de. paas.dispatcher.PortalDispatcher.service(PortalDispatcher.java:51)在org.eclipse.equinox.http.servlet.internal.ServletRegistration.handleRequest(ServletRegistration.java:91)在org.eclipse.equinox.http.servlet.internal. ProxySer 位于org.eclipse.equinox.http.servlet.internal.ProxyServlet.service(ProxyServlet.java:60)的vlet.processAlias(ProxyServlet.java:110),位于javax.servlet.http.HttpServlet.service(HttpServlet.java:722)在Org.eclipse.equinox.servletbridge.BridgeServlet.service(BridgeServlet.java:115)的javax.servlet.http.HttpServlet.service(HttpServlet.java:722)org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain) .java:305)org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)在org.apache.catalina的org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224). core.tandardContextValve.invoke(StandardContextValve.java:169)org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)在org.apache.catalina.valits.AccessLogVa的org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)lve.invoke(AccessLogValve.java:927)org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)at org .apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:987)org.apache.coyote.AbstractProtocol $ AbstractConnectionHandler.process(AbstractProtocol.java:579)at org.apache.tomcat.util.net.JIoEndpoint $ SocketProcessor .run(JIoEndpoint.java:309)在java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)java.lang上的java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:603). Thread.run(Thread.java:722)
我只能猜测这是OSGi魔术在后台引起的?!任何帮助都非常感谢.谢谢!!约翰内斯
该getVersion()方法已添加到Bundle软件包的1.5版本中org.osgi.framework,即OSGi版本4.2.看起来你已经针对OSGi R4.2进行了编译,但实际上是在较低的情况下运行.
通过在Import-Package语句中使用版本范围可以轻松避免此类问题.在此示例中,您应该将org.osgi.framework程序包作为版本范围导入[1.5,2.0)...这将阻止您的程序包解析早期版本的OSGi框架.