jClouds+;OpenStack:(NoSuchElementException)键[OpenStack中子]不在提供程序或API列表中

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)

我正在尝试将ApacheJClouds集成到Java项目中,以便访问OpenStackAPI。以下代码失败:

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