【发布时间】: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