OSGi 应用程序子系统处于活动状态,但其组件不是
Posted
技术标签:
【中文标题】OSGi 应用程序子系统处于活动状态,但其组件不是【英文标题】:OSGi application subsystem is ACTIVE, but its components are not 【发布时间】:2021-01-28 00:34:38 【问题描述】:我创建了一个 OSGi 包(用 Kotlin 编写),其中包含一个非常基本的组件,我将其注释为 @Component(immediate = true)
。此捆绑包在使用 Felix 6.0.3 时的行为与预期一样。
@Component(immediate = true)
class Bongo @Activate constructor(
@Reference(service = LoggerFactory::class)
private val logger: Logger
)
init
System.err.println("-------------- BONGO!")
logger.info("Started ", this::class.java)
@Activate
fun doIt()
throw InternalError("BOOM!")
然后,我将这个捆绑包(与其他一些捆绑包)压缩起来,并将其作为一个微不足道的应用程序子系统提供给 Apache Aries。我没有在此处创建明确的SUBSYSTEM.MF
,因为默认值 似乎 是我想要的。 Aries 安装并启动我的子系统,然后报告它是ACTIVE
。我什至已经确认 BundleActivator
已被正确调用。但是,我没有看到任何证据表明我的@Component
已经启动。看起来 SCR 忽略了它,这看起来很奇怪,因为我认为我需要 SCR 来运行应用程序子系统。 (我听说声明式服务已经取代了BundleActivator
...)
我浏览了 OSGi 文档,发现除了“启动”它之外,没有提到需要对 OSGi 子系统做任何事情,所以我对如何从这里开始感到困惑。谁能建议我可能错过的任何东西?
作为参考,这些是我的 bndrun
文件中的 Felix / Aries 捆绑包:
org.apache.aries.subsystem.api;version='[2.0.10,2.0.11)',\
org.apache.aries.subsystem.core;version='[2.0.10,2.0.11)',\
org.apache.aries.util;version='[1.1.1,1.1.2)',\
org.apache.felix.bundlerepository;version='[2.0.10,2.0.11)',\
org.apache.felix.configadmin;version='[1.9.18,1.9.19)',\
org.apache.felix.coordinator;version='[1.0.2,1.0.3)',\
org.apache.felix.log;version='[1.2.2,1.2.3)',\
org.apache.felix.logback;version='[1.0.2,1.0.3)',\
org.apache.felix.scr;version='[2.1.20,2.1.21)',\
org.eclipse.equinox.region;version='[1.2.101,1.2.102)',\
谢谢, 克里斯
【问题讨论】:
这段代码示例是用什么编程语言编写的? 我后来发现,当我将子系统作为功能而不是应用程序安装时,我的组件被激活了。但是,我也试图将我的子系统相互“沙箱化”,因此应用程序的“从父级导入并且不导出任何内容”目标似乎更合适。 这是 Kotlin。 好吧,这很令人困惑,因为看起来构造函数和doIt
方法都用@Activate
注释,这将是一个错误。但是,由于我不了解 Kotlin,因此很难判断这是否是真的。
它们都用@Activate
注解。框架坚持对构造函数进行注释,因为组件使用构造函数注入。但是,Felix 也不反对被注释的方法,甚至执行它。
【参考方案1】:
感谢Neil Bartlett,我现在了解到每个应用程序子系统都需要包含自己的 SCR 包,Felix 才能找到它的组件。具体来说:
SCR 不仅仅是一个依赖项,它会扫描包中的
Service-Component
标头。声明式服务规范没有描述 SCR 在运行框架的子系统中发现捆绑包的任何方式,因此您的捆绑包对它是不可见的。
David Jencks 还专门阐述了 Felix SCR:
IIRC 您需要使用
ds.global.extender
配置 SCR flag 设置为true
,那么单个 SCR 将在任何地方找到组件。
【讨论】:
以上是关于OSGi 应用程序子系统处于活动状态,但其组件不是的主要内容,如果未能解决你的问题,请参考以下文章
当应用程序从后台处于活动状态时,如何避免在本机反应中安装组件?
如何确定当前视图控制器是不是处于活动状态,如果处于活动状态则执行代码