SCR(ServiceMix)没有拾取OSGI组件?

Posted

技术标签:

【中文标题】SCR(ServiceMix)没有拾取OSGI组件?【英文标题】:OSGI component not being picked up by SCR (ServiceMix)? 【发布时间】:2018-10-08 11:23:15 【问题描述】:

我正在尝试创建一个 OPS4J PAX 配置 DataSource 预挂钩,以通过 Liquibase 自动执行数据库结构完整性检查和更新。根据this tutorial,我所要做的就是用@Component 注释标记PreHook 实现,给它一个name 属性并在DataSource 配置中引用该属性,我已经这样做了。

问题似乎是 SCR 从未选择过该组件。

@Component(property = "name=coredbmigrate")
public class LiquibaseMigrator implements PreHook 
    public LiquibaseMigrator() 
        System.out.println();
        System.out.println("PREHOOK INITIALIZED");
        System.out.println();
    

    @Override
    public void prepare(DataSource dataSource) throws SQLException 
        System.out.println();
        System.out.println("PREHOOK CALLED");
        System.out.println();
    

如您所见,我添加了基本输出来指示组件何时被调用和调用,而这些都不会发生。

生成的OSGI-INF/lv.cps.is.ledger.accounts.db.LiquibaseMigrator.xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<component name="lv.cps.is.ledger.accounts.db.LiquibaseMigrator">
    <implementation class="lv.cps.is.ledger.accounts.db.LiquibaseMigrator"/>
    <service>
        <provide interface="org.ops4j.pax.jdbc.hook.PreHook"/>
    </service>
    <property name="name" type="String" value="coredbmigrate"/>
</component>

MANIFEST.MF 中的Service-Component 标头也设置正确。

组件从未实例化的原因可能是什么?或者可能是,但我没有看到?

【问题讨论】:

怎么看没有被scr捡起来? 构造函数没有输出。有没有更好的方法来检查它是否已加载? scr:list 命令说明了什么?这始终是使用 SCR 进行检查的第一件事……从构造函数中查找输出是不可靠的,因为您的组件可能工作正常,但仍然没有输出任何内容,因为它是延迟加载的。 【参考方案1】:

您是否安装了 scr 功能?默认情况下它没有安装,在这种情况下 DS 组件会被忽略。

安装后,您可以使用 scr:* 命令检查组件的状态。

【讨论】:

就是这样。我假设默认安装了 SCR。一个简单的feature:install scr 解决了这个问题。谢谢。

以上是关于SCR(ServiceMix)没有拾取OSGI组件?的主要内容,如果未能解决你的问题,请参考以下文章

无法在 Apache ServiceMix 中启动 OSGI 包

在 Apache Servicemix 4 中的 OSGi 包之间共享配置文件?

使用 osgi 的声明式服务时,我可以在同一个组件中提供和引用服务吗?

通过 org.osgi.service.component 注解抽象组件

ServiceMix 4 中的集群

OSGi 和数据库驱动程序