1

我正在尝试将 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:键 [openstack-neutron] 不在提供程序或 api 列表中:{providers=[ultradns-ws], apis=[swift, swift-keystone]}

这显然是一个常见问题,但是jClouds 故障排除中提供的建议并不能解决它。还有另一个关于这个问题的 StackOverflow 讨论,但没有一个公认的答案。

几个有用的点:

  • 我们的 Java 项目使用 Ant,而 jClouds 是基于 Maven。jClouds 安装指南提供了使用 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 文件复制到类路径文件夹中,现在我可以访问 Neutron 对象了。
  • 所有在线资源都表明这是一个类路径/依赖问题。我已经验证 openstack-neutron-1.9.1.jar 库在我的 .classpath 和 build.xml 文件中都可用。没有分辨率。

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

4

3 回答 3

2

当您将提供程序/api id 作为字符串传递给 时ContextBuilder,java 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-neutron jar,这应该可以工作。如果是这样,它也表明您的项目中有一些东西正在阻止 ServiceLoader 正常运行。它不会影响 jclouds,因为它仅在创建上下文时使用它,但您可能需要修复它。

于 2015-11-10T21:10:09.057 回答
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

您在使用 ant 指令时遇到了哪些问题?

于 2015-11-10T19:26:48.363 回答
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
于 2017-05-18T11:23:49.937 回答