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 的声明式服务时,我可以在同一个组件中提供和引用服务吗?