0

我创建了一个 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. 我什至已经确认 aBundleActivator已被正确调用。但是,我没有看到任何证据表明我@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)',\

谢谢,克里斯

4

1 回答 1

2

感谢Neil Bartlett,我现在明白每个应用程序子系统都需要包含自己的 SCR 包,然后 Felix 才能找到它的组件。具体来说:

SCR 不仅仅是一个依赖项,它会扫描包中的Service-Component标头。声明式服务规范没有描述 SCR 在运行框架的子系统中发现捆绑包的任何方式,因此您的捆绑包对它是不可见的。

David Jencks 还专门阐述了 Felix SCR:

IIRC 您需要将 SCR 的ds.global.extender 标志设置为true,然后单个 SCR 将在任何地方找到组件。

于 2020-10-14T19:45:34.567 回答