OSGi 应用程序子系统处于活动状态,但其组件不活动
OSGi application subsystem is ACTIVE, but its components are not
我创建了一个 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)',\
谢谢,
克里斯
感谢 Neil Bartlett,我现在明白每个应用程序子系统都需要包含自己的 SCR 包,然后 Felix 才能找到它的组件。具体来说:
SCR is not just a dependency, it scans bundles for the Service-Component
header. The Declarative Services specification does not describe any way for SCR to discover bundles inside a subsystem of the running framework, therefore your bundles will be invisible to it.
David Jencks 还专门阐述了 Felix SCR:
IIRC you need to configure SCR with the ds.global.extender
flag set to true
, then the single SCR will find components everywhere.
我创建了一个 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)',\
谢谢, 克里斯
感谢 Neil Bartlett,我现在明白每个应用程序子系统都需要包含自己的 SCR 包,然后 Felix 才能找到它的组件。具体来说:
SCR is not just a dependency, it scans bundles for the
Service-Component
header. The Declarative Services specification does not describe any way for SCR to discover bundles inside a subsystem of the running framework, therefore your bundles will be invisible to it.
David Jencks 还专门阐述了 Felix SCR:
IIRC you need to configure SCR with the
ds.global.extender
flag set totrue
, then the single SCR will find components everywhere.