Karaf、CXF与JAX-RS服务未被发现问题求助
解决方案
1. 修复构造函数名称错误
这是核心问题:MyServiceImpl的构造函数名称写错为AccountStorageServiceImpl,导致类无法被Blueprint正确实例化。修改为:
public MyServiceImpl() { System.out.println("MyService starting..."); }
2. 安装必要的Blueprint特性
Karaf中使用Blueprint容器需确保基础特性已安装,执行以下命令:
feature:install blueprint feature:install blueprint-web
3. 调整Bundle插件的依赖嵌入配置
当前Embed-Dependency将所有编译/运行时依赖嵌入Bundle,会与Karaf容器中已有的CXF、JAX-RS包产生类加载冲突。修改配置排除容器提供的依赖:
<Embed-Dependency>*;scope=compile|runtime;inline=false;excludeGroupIds=javax.ws.rs,org.apache.cxf,org.osgi</Embed-Dependency>
4. 显式指定JAX-RS资源类
在Blueprint的jaxrs:server中添加jaxrs:classes节点,明确指定资源类,确保CXF能扫描到注解:
<jaxrs:server id="myService" address="/test"> <jaxrs:serviceBeans> <ref component-id="myServiceBean" /> </jaxrs:serviceBeans> <jaxrs:classes> <value>my.base.package.impl.MyServiceImpl</value> </jaxrs:classes> </jaxrs:server>
5. 确保CXF版本与Karaf兼容
Karaf 4.4.3自带的CXF版本与3.3.5可能存在兼容性问题,建议使用Karaf提供的官方CXF特性:
feature:uninstall cxf feature:install cxf-jaxrs
同时移除pom.xml中自行引入的CXF相关依赖,避免版本冲突。
6. 开启Blueprint调试日志排查问题
如果问题仍存在,开启Blueprint调试日志查看详细加载过程:
log:set DEBUG org.apache.aries.blueprint
通过日志检查Bean是否被正确创建、依赖是否满足,以及是否有其他加载异常。
内容的提问来源于stack exchange,提问作者k4rnaj1k
相关产品推荐
相关产品推荐

