Karaf 4.2.1中OpenStack4j 3.10调用authenticate()报ConnectorNotFoundException求助
我基于Karaf 4.2.1搭建OSGi应用,使用OpenStack4j 3.10版本,打算通过openstack4j-httpclient连接器对接OpenStack,认证代码如下:
os = OSFactory.builderV3() .endpoint(ostackServiceConfiguration.getServerAddress()) .credentials(ostackServiceConfiguration.getUserName(), ostackServiceConfiguration.getPassword(), Identifier.byName(ostackServiceConfiguration.getUserDomainName())) .scopeToProject(Identifier.byName(ostackServiceConfiguration.getProjectName()), Identifier.byName(ostackServiceConfiguration.getUserDomainName())) .authenticate();
调用authenticate()时触发了ConnectorNotFoundException,反复重装连接器包、重启Karaf都没用,其他Bundle运行正常。调试后发现问题出在HttpExecutorService::execute()调用——这个接口在openstack4j-core里定义,但对应的openstack4j-httpclient实现始终找不到。
下面是几个可行的排查和解决方向:
检查OSGi包的导入导出配置
确认openstack4j-core的MANIFEST.MF里正确导出了org.openstack4j.core.transport包(HttpExecutorService的所在包);同时检查openstack4j-httpclient的MANIFEST.MF,确保它导入了上述包,并且通过Service-Component或Provide-Capability声明了对HttpExecutorService接口的实现。显式指定HttpClient执行器
不要依赖OSGi的服务自动发现,直接在代码里创建并指定HttpClient实现:// 初始化HttpClient执行器 HttpExecutorService httpExecutor = HttpClientExecutorService.create(); os = OSFactory.builderV3() .endpoint(ostackServiceConfiguration.getServerAddress()) .credentials(ostackServiceConfiguration.getUserName(), ostackServiceConfiguration.getPassword(), Identifier.byName(ostackServiceConfiguration.getUserDomainName())) .scopeToProject(Identifier.byName(ostackServiceConfiguration.getProjectName()), Identifier.byName(ostackServiceConfiguration.getUserDomainName())) .withExecutorService(httpExecutor) // 强制指定执行器 .authenticate();确认Karaf中包的状态与依赖顺序
用bundle:list命令查看openstack4j-core和openstack4j-httpclient的状态,确保两者都是Active状态;如果是通过feature安装的,检查feature.xml里是否明确声明openstack4j-httpclient依赖openstack4j-core,保证启动顺序正确。排查类加载隔离问题
使用bundle:classes <bundle-id>分别查看两个包的可见类,确认openstack4j-core能加载到openstack4j-httpclient中的HttpExecutorService实现类;同时检查是否有其他Bundle提供了同接口的实现,导致服务发现冲突。
内容的提问来源于stack exchange,提问作者Marcel Jahnke

