簡體   English   中英

jClouds + OpenStack:(NoSuchElementException)鍵[openstack-neutron]不在提供程序或API的列表中

[英]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討論 ,但是沒有公認的答案。

一些有用的要點:

  • 我們的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文件復制到classpath文件夾中,現在我可以訪問Neutron對象了。
  • 所有在線資源都表明這是一個classpath / dependency問題 我已經驗證了.classpath和build.xml文件中都提供了openstack-neutron-1.9.1.jar庫。 沒有分辨率。

我將不勝感激任何想法或建議!

當您將提供者/ api id作為字符串傳遞給ContextBuilder ,將使用java ServiceLoader加載api類。 它將掃描類路徑中的META-INF/services文件夾,並查找ApiMetadataProviderMetadata

您可以驗證您的環境中是否沒有類加載問題,這些問題會阻止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,因為它僅在創建上下文時使用它,但是您可能需要修復它。

這里有一些例子:

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

您使用螞蟻指令遇到什么問題?

如果使用的是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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM