服务在 xml 中的第一个包中定义。
在第二个包中,使用相同的接口(interface)在 xml 中定义引用。
在激活器的第二个包中,我通过以下方式获取服务引用:
ServiceReference servReference = context.getServiceReference(MyInterface.class.getName());
除非第一个 bundle 在第二个 bundle 之后启动,否则一切都会正常工作。
然后我得到:
org.osgi.framework.BundleException: Activator start error in bundle foo.bar.baz [123].
Caused by: java.lang.NullPointerException: Specified service reference cannot be null.`
过了一会儿,第一个 bundle 启动,一切正常。
所以我的问题是如何强制第二个包等待第一个包启动?
最佳答案
在 OSGi 中,您永远不应该等待另一个包或启动或服务出现。特别是永远不要在 Activator 中等待,因为它会阻止其他 bundle 的启动。
在您的情况下,您需要对 MyInterface 服务出现的事件使用react。
如果您需要使用普通的 OSGi API,那么您可以使用 ServiceTracker。您可以重写addingService 和removedService 方法,并在其中控制需要该服务的类的生命周期。因此,当服务启动时,您创建该类的实例,注入(inject)服务并最终启动一些回调,让该类知道该服务在那里。当服务消失时,您告诉实例关闭。例如,请参阅 "Tracking a service".
正如您可以想象的那样,这对于跟踪单个服务并将其注入(inject)到类实例中很简单,但一旦涉及更多服务和实例,它就会变得非常困难。这就是为什么您通常不应该使用普通的 OSGi API。
因此,您应该使用依赖管理框架(例如声明性服务或蓝图)来为您处理这项繁重的工作。
关于java - 如何配置 bundle 在引用的 bundle 启动后启动?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48908193/