【问题标题】:OSGI component not being picked up by SCR (ServiceMix)?SCR(ServiceMix)没有拾取OSGI组件?
【发布时间】: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 进行检查的第一件事……从构造函数中查找输出是不可靠的,因为您的组件可能工作正常,但仍然没有输出任何内容,因为它是延迟加载的。

标签: java osgi apache-karaf apache-servicemix


【解决方案1】:

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

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

【讨论】:

  • 就是这样。我假设默认安装了 SCR。一个简单的feature:install scr 解决了这个问题。谢谢。
猜你喜欢
  • 1970-01-01
  • 2010-10-02
  • 2015-12-26
  • 2018-01-26
  • 2014-12-01
  • 2013-04-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多