[英]jClouds + OpenStack: (NoSuchElementException) key [openstack-neutron] not in the list of providers or apis
我正在嘗試將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討論 ,但是沒有公認的答案。
一些有用的要點:
我將不勝感激任何想法或建議!
當您將提供者/ 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,因為它僅在創建上下文時使用它,但是您可能需要修復它。
這里有一些例子:
他們使用Maven,但是它們是比較代碼/依賴關系的一個很好的起點。
另外,也許您可以使用類似的方法來管理jclouds依賴項作為替代方案? https://maven.apache.org/ant-tasks/
您也可以嘗試從maven下載jclouds-neutron,而不是對其進行編譯:
您使用螞蟻指令遇到什么問題?
如果使用的是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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.