jClouds + OpenStack :( NoSuchElementException)键[openstack-neutron]不在提供者列表或apis中

时间:2015-11-10 18:51:02

标签: openstack jclouds openstack-neutron

我试图将Apache jClouds集成到Java项目中,以便我可以访问OpenStack API。以下代码失败:

neutronApi = ContextBuilder.newBuilder("openstack-neutron")
                    .credentials(USERNAME, API_KEY)
                    .endpoint(AUTH_URL)
                    .modules(modules)
                    .buildApi(NeutronApi.class);

出现以下错误消息:

Java.util.NoSuchElementException:key [openstack-neutron]不在提供者列表或apis中:{providers = [ultradns-ws],apis = [swift,swift-keystone]}

这显然是一个常见问题,但suggestions offered in jClouds troubleshooting无法解决问题。关于这个问题有another StackOverflow discussion但没有接受的答案。

一些有用的观点:

  • 我们的Java项目使用Ant,而jClouds基于Maven。 jClouds安装指南provides directions to install using Ant,但它们都不能正常工作。相反,我从源代码(https://github.com/jclouds/jclouds)编译了jClouds并将.jar文件复制到我的类路径上的文件夹中。现在我可以在我的代码中访问jClouds对象。
  • 默认的jclouds源不包含OpenStack Neutron对象。我最终在OpenStack Labs源代码(https://github.com/jclouds/jclouds-labs-openstack)中找到了这些内容。从源代码编译,将openstack-neutron-1.9.1.jar文件复制到classpath文件夹中,现在我可以访问Neutron对象了。
  • 所有在线消息来源都认为这是类路径/依赖性问题。我已经验证了openstack-neutron-1.9.1.jar库在我的.classpath和build.xml文件中都可用。没有决议。

我很感激任何想法或建议!

3 个答案:

答案 0 :(得分:2)

当您将provider / api id作为字符串传递给ContextBuilder时,将使用java ServiceLoader来加载api类。它将扫描类路径中的META-INF/services文件夹,并查找ApiMetadataProviderMetadata的实现。

您是否可以验证在您的环境中是否存在可能阻止ServiceLoader正常运行的类加载问题?

作为替代方案,您可以绕过ServiceLoader查找并直接提供具体的ApiMetadata实现。在你的情况下,它将是这样的:

NeutronApi neutron = ContextBuilder.newBuilder(new NeutronApiMetadata())
   .credentials(USERNAME, API_KEY)
   .endpoint(AUTH_URL)
   .modules(modules)
   .buildApi(NeutronApi.class);

如果你的类路径中有openstack-neutron jar,那么这应该可行。如果确实如此,它还表明项目中存在阻止ServiceLoader正常运行的内容。它不会影响jclouds,因为它只在创建上下文时使用它,但它可能是你想要解决的问题。

答案 1 :(得分:0)

这里有一些例子:

https://github.com/jclouds/jclouds-examples/blob/master/rackspace/src/main/java/org/jclouds/examples/rackspace/cloudnetworks/CreateNetwork.java

他们使用maven,但它们是比较代码/依赖关系的良好起点。

另外,也许您可​​以使用类似的东西来管理jclouds依赖项作为替代方案吗? https://maven.apache.org/ant-tasks/

您也可以尝试从maven下载jclouds-neutron,而不是编译它:

https://search.maven.org/#artifactdetails%7Corg.apache.jclouds.labs%7Copenstack-neutron%7C1.9.1%7Cbundle

你对蚂蚁指示有什么问题?

答案 2 :(得分:0)

如果您正在使用maven,则应添加以下依赖项:

<dependency>
    <groupId>org.apache.jclouds.provider</groupId>
    <artifactId>aws-ec2</artifactId>
    <version>${jclouds.version}</version>
</dependency>

然后,从命令行打包:

mvn clean package

并添加依赖项:

mvn dependency:copy-dependencies -DoutputDirectory="./lib"

并执行:

java -cp "target/jar-with-dependencies.jar:lib/*" YourClass