我创建了一个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!")
}
}
然后,我将这个捆绑包(与其他一些捆绑包(压缩,并将其作为一个琐碎的应用程序子系统提供给ApacheAries。我没有在这里创建显式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)',
谢谢,Chris
感谢Neil Bartlett,我现在明白了,在Felix找到其组件之前,每个应用程序子系统都需要包含自己的SCR捆绑包。具体而言:
SCR不仅仅是一个依赖项,它扫描捆绑包以查找
Service-Component
标头。声明性服务规范没有描述SCR在运行框架的子系统内发现捆绑包的任何方式,因此您的捆绑包对它来说是不可见的。
David Jencks还专门阐述了Felix SCR:
IIRC您需要使用
ds.global.extender
配置SCR标志设置为true
,则单个SCR将在各处找到组件。