我正在尝试将Apache集成到一个jClouds项目中,以便能够访问OpenStack API。以下代码失败:
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讨论,但没有一个被接受的答案。
以下几点是有用的:
如有任何意见或建议,我将不胜感激!
发布于 2015-11-10 21:10:09
当您将提供者/ api id作为字符串传递给ContextBuilder时,ServiceLoader将被用来加载api类。它将扫描类路径中的META-INF/services文件夹,并查找ApiMetadata和ProviderMetadata的实现。
您能否验证在您的环境中没有可能阻止ServiceLoader正常运行的类加载问题?
作为一种替代,您可以绕过ServiceLoader查找,直接提供具体的ApiMetadata实现。在你的例子中,它应该是这样的:
NeutronApi neutron = ContextBuilder.newBuilder(new NeutronApiMetadata())
.credentials(USERNAME, API_KEY)
.endpoint(AUTH_URL)
.modules(modules)
.buildApi(NeutronApi.class);如果您的类路径中有openstack中子罐,这应该是可行的。如果是这样的话,它还表明您的项目中有一些东西妨碍了ServiceLoader的正常运行。它不会影响jclouds,因为它只在创建上下文时使用它,但是您可能希望修复它。
发布于 2015-11-10 19:26:48
这里有一些例子:
它们使用maven,但是它们是比较代码/依赖关系的一个很好的起点。
另外,也许您可以使用类似的东西来管理jclouds依赖项,作为替代?https://maven.apache.org/ant-tasks/。
您还可以尝试从maven下载jclouds中子,而不是编译它:
你用蚂蚁指令碰到了什么问题?
发布于 2017-05-18 11:23:49
如果使用的是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/*" YourClasshttps://stackoverflow.com/questions/33637344
复制相似问题