Kotlin OSGi应用子系统处于活动状态,但其组件不处于活动状态

Kotlin OSGi应用子系统处于活动状态,但其组件不处于活动状态,kotlin,osgi,apache-felix,aries,Kotlin,Osgi,Apache Felix,Aries,我创建了一个OSGi包(用Kotlin编写),其中包含一个非常基本的组件,我将其注释为@component(immediate=true)。使用Felix 6.0.3,此捆绑包的行为与预期一致 @组件(立即=真) 类Bongo@Activate构造函数( @引用(服务=LoggerFactory::类) 专用val记录器:记录器 ) { 初始化{ System.err.println(“------------BONGO!”) info(“启动{}”,this::class.java) } @激

我创建了一个OSGi包(用Kotlin编写),其中包含一个非常基本的组件,我将其注释为
@component(immediate=true)
。使用Felix 6.0.3,此捆绑包的行为与预期一致

@组件(立即=真)
类Bongo@Activate构造函数(
@引用(服务=LoggerFactory::类)
专用val记录器:记录器
) {
初始化{
System.err.println(“------------BONGO!”)
info(“启动{}”,this::class.java)
}
@激活
乐事{
抛出内部错误(“轰!”)
}
}
然后,我将这个捆绑包压缩(与其他一些捆绑包一起),并将其作为一个简单的应用程序子系统提供给ApacheAries。我没有在这里创建显式的
SUBSYSTEM.MF
,因为默认值似乎是我想要的。Aries安装并启动我的子系统,然后报告它处于活动状态。我甚至已确认已正确调用
BundleActivator
。但是,我没有看到任何证据表明我的
@组件已启动。看起来SCR忽略了它,这看起来很奇怪,因为我认为我需要SCR来运行应用程序子系统。(我听说声明性服务已经取代了
BundleActivator
。)

我浏览了OSGi文档,发现除了“启动”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

多亏了,我现在了解到,在Felix找到其组件之前,每个应用子系统都需要包含自己的SCR捆绑包。具体而言:

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

David Jencks还详细阐述了Felix SCR:

IIRC您需要使用
ds.global.extender
标志设置为
true
,则单个SCR将到处都能找到组件

多亏了,我现在了解到,在Felix找到其组件之前,每个应用程序子系统都需要包含自己的SCR包。具体而言:

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

David Jencks还详细阐述了Felix SCR:

IIRC您需要使用
ds.global.extender
标志设置为
true
,则单个SCR将到处都能找到组件


这个代码示例是用什么编程语言编写的?我后来发现,当我将子系统作为功能而不是应用程序安装时,我的组件会被激活。然而,我也试图从彼此“沙箱”我的子系统,因此应用程序的“从父级导入,不导出任何内容”目标似乎更适合。这是Kotlin。好吧,这很混乱,因为它看起来构造函数和
doIt
方法都用
@Activate
注释,这将是一个错误。然而,由于我不认识Kotlin,很难判断这是否真的是真的。它们都用
@Activate
注释。框架坚持构造函数是注释的,因为组件使用构造函数注入。然而,Felix也不反对对方法进行注释,甚至执行它。这个代码示例是用什么编程语言编写的?后来我发现,当我将子系统作为功能而不是应用程序安装时,我的组件会被激活。然而,我也试图从彼此“沙箱”我的子系统,因此应用程序的“从父级导入,不导出任何内容”目标似乎更适合。这是Kotlin。好吧,这很混乱,因为它看起来构造函数和
doIt
方法都用
@Activate
注释,这将是一个错误。然而,由于我不认识Kotlin,很难判断这是否真的是真的。它们都用
@Activate
注释。框架坚持构造函数是注释的,因为组件使用构造函数注入。然而,Felix并不反对对方法进行注释,甚至执行它。