我试图将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但没有接受的答案。
一些有用的观点:
我很感激任何想法或建议!
答案 0 :(得分:2)
当您将provider / 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,因为它只在创建上下文时使用它,但它可能是你想要解决的问题。
答案 1 :(得分:0)
这里有一些例子:
他们使用maven,但它们是比较代码/依赖关系的良好起点。
另外,也许您可以使用类似的东西来管理jclouds依赖项作为替代方案吗? https://maven.apache.org/ant-tasks/
您也可以尝试从maven下载jclouds-neutron,而不是编译它:
你对蚂蚁指示有什么问题?
答案 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