首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >jClouds + OpenStack:(NoSuchElementException)密钥[openstack-中子]不在提供者或apis列表中

jClouds + OpenStack:(NoSuchElementException)密钥[openstack-中子]不在提供者或apis列表中
EN

Stack Overflow用户
提问于 2015-11-10 18:51:01
回答 3查看 620关注 0票数 1

我正在尝试将Apache集成到一个jClouds项目中,以便能够访问OpenStack API。以下代码失败:

代码语言:javascript
复制
neutronApi = ContextBuilder.newBuilder("openstack-neutron")
                    .credentials(USERNAME, API_KEY)
                    .endpoint(AUTH_URL)
                    .modules(modules)
                    .buildApi(NeutronApi.class);

带有以下错误消息:

Java.util.NoSuchElementException:密钥openstack-未在提供者或api列表中的中子:{ providers =ultradns-ws,apis=swift,swift}

这显然是一个常见的问题,但是jClouds故障排除中的建议没有解决它。有关于这个问题的另一次StackOverflow讨论,但没有一个被接受的答案。

以下几点是有用的:

  • 我们的Java项目使用Ant,而jClouds则基于Maven. jClouds Installation Guide 提供使用Ant安装的说明。,但没有一个正确工作。相反,我从源代码(https://github.com/jclouds/jclouds)编译https://github.com/jclouds/jclouds,并将.jar文件复制到类路径上的一个文件夹中。现在我可以访问代码中的jClouds对象了。
  • 默认的jclouds源不包括OpenStack中子对象。我最终在OpenStack实验室的源代码(https://github.com/jclouds/jclouds-labs-openstack)中找到了这些。从源代码编译,将OpenStack-中子-1.9.1.jar文件复制到类路径文件夹中,现在我可以访问中子对象了。
  • 所有在线资源都表明这是一个类路径/依赖问题,。我已经验证了OpenStack-中子-1.9.1.jar库可以在我的.classpath和build.xml文件中使用。没有决心。

如有任何意见或建议,我将不胜感激!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-11-10 21:10:09

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

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

作为一种替代,您可以绕过ServiceLoader查找,直接提供具体的ApiMetadata实现。在你的例子中,它应该是这样的:

代码语言:javascript
复制
NeutronApi neutron = ContextBuilder.newBuilder(new NeutronApiMetadata())
   .credentials(USERNAME, API_KEY)
   .endpoint(AUTH_URL)
   .modules(modules)
   .buildApi(NeutronApi.class);

如果您的类路径中有openstack中子罐,这应该是可行的。如果是这样的话,它还表明您的项目中有一些东西妨碍了ServiceLoader的正常运行。它不会影响jclouds,因为它只在创建上下文时使用它,但是您可能希望修复它。

票数 2
EN

Stack Overflow用户

发布于 2015-11-10 19:26:48

这里有一些例子:

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中子,而不是编译它:

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

你用蚂蚁指令碰到了什么问题?

票数 0
EN

Stack Overflow用户

发布于 2017-05-18 11:23:49

如果使用的是maven,则应该添加以下依赖项:

代码语言:javascript
复制
<dependency>
    <groupId>org.apache.jclouds.provider</groupId>
    <artifactId>aws-ec2</artifactId>
    <version>${jclouds.version}</version>
</dependency>

然后,从命令行打包:

代码语言:javascript
复制
mvn clean package

并添加依赖项:

代码语言:javascript
复制
mvn dependency:copy-dependencies -DoutputDirectory="./lib"

并执行:

代码语言:javascript
复制
java -cp "target/jar-with-dependencies.jar:lib/*" YourClass
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33637344

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档