jClouds+;OpenStack:(NoSuchElementException)键[OpenStack中子]不在提供程序或API列表中
我正在尝试将ApacheJClouds集成到Java项目中,以便访问OpenStackAPI。以下代码失败:jClouds+;OpenStack:(NoSuchElementException)键[OpenStack中子]不在提供程序或API列表中,openstack,jclouds,openstack-neutron,Openstack,Jclouds,Openstack Neutron,我正在尝试将ApacheJClouds集成到Java项目中,以便访问OpenStackAPI。以下代码失败: neutronApi = ContextBuilder.newBuilder("openstack-neutron") .credentials(USERNAME, API_KEY) .endpoint(AUTH_URL) .modules(modules)
neutronApi = ContextBuilder.newBuilder("openstack-neutron")
.credentials(USERNAME, API_KEY)
.endpoint(AUTH_URL)
.modules(modules)
.buildApi(NeutronApi.class);
显示以下错误消息:
Java.util.NoSuchElementException:key[openstack中子]不在提供程序或API列表中:{providers=[ultradns ws],API=[swift,swift keystone]}
这显然是一个常见的问题,但是问题并没有解决。这个问题有很多问题,但没有公认的答案
以下几点很有用:
- 我们的Java项目使用Ant,而jClouds基于Maven。jClouds安装指南,但没有一个能正常工作。相反,我从source()编译了jClouds,并将.jar文件复制到类路径上的一个文件夹中。现在我可以访问代码中的jClouds对象了
- 默认jclouds源不包括OpenStack中子对象。我最终在OpenStack实验室的源代码()中找到了这些。从源代码编译,将openstack-中子-1.9.1.jar文件复制到classpath文件夹中,现在我可以访问中子对象了
- 所有在线来源都表明这是一个类路径/依赖性问题。我已经验证了openstack-中子-1.9.1.jar库在我的.classpath和build.xml文件中都可用。没有决议
如果有任何想法或建议,我将不胜感激 这里有一些例子: 它们使用maven,但它们是比较代码/依赖关系的良好起点 另外,您也可以使用类似的方法来管理jclouds依赖项,作为替代方案 您也可以尝试从maven下载jclouds中子,而不是编译它:
ant指令遇到了什么问题?当您将提供者/api id作为字符串传递给
ContextBuilder
时,java将用于加载api类。它将扫描类路径中的META-INF/services
文件夹,并查找ApiMetadata
和ProviderMetadata
的实现
您能否验证在您的环境中没有可能阻止ServiceLoader正常运行的类加载问题
作为替代方案,您可以绕过ServiceLoader查找,直接提供具体的API元数据实现。在您的情况下,它将类似于:
NeutronApi中子=ContextBuilder.newBuilder(新的NeutronApiMetadata())
.凭据(用户名、API_密钥)
.endpoint(AUTH_URL)
.模块(模块)
.buildApi(Neutonapi.class);
如果您的类路径中有openstack中子罐,这应该可以工作。如果确实如此,它还表明您的项目中存在阻止ServiceLoader正常运行的问题。它不会影响jclouds,因为它只在创建上下文时使用它,但您可能需要修复它。如果您使用的是maven,则应添加以下依赖项:
<dependency>
<groupId>org.apache.jclouds.provider</groupId>
<artifactId>aws-ec2</artifactId>
<version>${jclouds.version}</version>
</dependency>
并添加依赖项:
mvn dependency:copy-dependencies -DoutputDirectory="./lib"
并执行:
java -cp "target/jar-with-dependencies.jar:lib/*" YourClass
非常感谢。调用
NeutronApiMetadata()
实现修复了它。这个项目在类路径中甚至没有一个META-INF/services
文件夹,这可能就是它以前不工作的原因。谢谢你的帮助!每个jcloudsapijar都提供了相应实现的文件夹。openstack中子罐有自己的,ServiceLoader应该能够选择它。
java -cp "target/jar-with-dependencies.jar:lib/*" YourClass