OSGI组件未被ServiceMix的SCR识别?PAX DataSource预钩子配置求助
我之前在做OSGi环境下的Liquibase数据库迁移时,也碰到过类似的SCR组件不识别的坑,结合你的场景,给你几个实用的排查和解决方向:
先确认注解依赖与包的正确性
你用的@Component注解一定要来自org.apache.felix.scr.annotations包,千万别和Spring的@Component搞混!如果依赖没引对,或者引入了错误的包,SCR完全不会识别你的组件。检查你的构建文件(比如pom.xml)里是否有正确的依赖:<dependency> <groupId>org.apache.felix</groupId> <artifactId>org.apache.felix.scr.annotations</artifactId> <version>1.12.0</version> <scope>provided</scope> </dependency>确保SCR注解处理器在构建时生效
光加注解还不够,必须让构建工具把注解转换成SCR能识别的元数据XML文件。比如用Maven的话,一定要配置maven-scr-plugin,它负责生成OSGI-INF/scr下的组件描述文件:<plugin> <groupId>org.apache.felix</groupId> <artifactId>maven-scr-plugin</artifactId> <version>1.20.0</version> <executions> <execution> <id>generate-scr-metadata</id> <goals> <goal>scr</goal> </goals> </execution> </executions> </plugin>构建完后去bundle的OSGI-INF/scr目录下看看,有没有生成对应
LiquibaseMigrator的XML文件,如果没有,说明插件没工作,这是最常见的原因。检查@Component注解的属性配置
你写的@Component(property = "name=coredbmigrate")是把name作为服务属性设置,但如果你的DataSource配置需要引用的是组件的ID,那应该直接用name属性指定:@Component(name = "coredbmigrate") public class LiquibaseMigrator implements PreHook { // 你的代码逻辑 }确认一下DataSource配置里引用的是组件ID还是服务属性,对应调整注解的写法。
验证组件类的基础要求
SCR对组件类有硬性要求:必须是public类,且要有公共的无参构造方法。如果你的LiquibaseMigrator是内部类、非public,或者只有带参数的构造函数,SCR无法实例化它,自然也识别不了。通过OSGi工具排查
启动OSGi容器后,用Gogo shell的命令来排查:- 执行
scr:list查看所有已注册的SCR组件,找你的coredbmigrate是否在列表中 - 执行
log:display查看启动日志,有没有组件注册失败的错误信息(比如类找不到、依赖缺失)
- 执行
先从前面两点入手,这两个是绝大多数SCR组件不识别问题的根源。
内容的提问来源于stack exchange,提问作者modo_lv

