2014-02-10 39 views
0

我試圖在我的應用程序中使用Jclouds,以便它可以同時與多個提供程序一起工作。具體來說,我試圖使用「openstack-nova」提供程序和「rackspace-cloudservers-us」提供程序,以便我可以在運行時在兩個不同的雲中配置節點。然而,似乎供應商正在彼此跺腳;當我包括我的Maven構建既依賴關係,Rackspace公司的供應商只有在提供者列表中可用的一個:與多個提供商的Jclouds

<dependency> 
    <groupId>org.apache.jclouds.provider</groupId> 
    <artifactId>rackspace-cloudservers-us</artifactId> 
    <version>1.7.0</version> 
    </dependency> 
    <dependency> 
    <groupId>org.apache.jclouds.api</groupId> 
    <artifactId>openstack-nova</artifactId> 
    <version>1.7.0</version> 
    </dependency> 

註釋掉Rackspace公司提供的依賴將使得OpenStack的新星工作。有沒有辦法讓多個提供商同時使用Jclouds

回答

0

我想通了,但忘了我問了這個問題。這是發生了什麼事。

jClouds提供程序向Java ServiceLoaders註冊自己。這意味着這個文件在META-INF/services目錄中有jClouds核心在運行時注入的提供程序類名。我用Shade製作了一個胖JAR,這意味着這個文件的內容在最終的JAR中被覆蓋。

這留下了一個條目而不是兩個,所以在運行時jClouds找不到其他提供者。我不得不添加一個配置選項來確保Shade沒有壓制掉這個文件。這是我已經爲Spring做的事情,所以一旦我意識到jClouds在做什麼,這是一個非常簡單的修復。

這裏是我的插件的配置看起來像任何人的好奇:

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-shade-plugin</artifactId> 
    <executions> 
     <execution> 
     <phase>package</phase> 
     <goals> 
      <goal>shade</goal> 
     </goals> 
     <configuration> 
      <createDependencyReducedPom>false</createDependencyReducedPom> 
      <transformers> 
      <!--Need to do this to make sure spring schemas dont stomp on each other--> 
      <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer"> 
       <resource>META-INF/spring.handlers</resource> 
      </transformer> 
      <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer"> 
       <resource>META-INF/spring.schemas</resource> 
      </transformer> 
      <!-- Need to make sure jClouds providers play nicely --> 
      <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer"> 
       <resource>META-INF/services/org.jclouds.apis.ApiMetadata</resource> 
      </transformer> 
      <!--Executable JAR-ify this--> 
      <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> 
       <mainClass>com.example.Main</mainClass> 
      </transformer> 
      </transformers> 
     </configuration> 
     </execution> 
    </executions> 
    </plugin> 
0

這應該是完美的。您應該能夠通過將「rackspace-cloudservers-us」傳遞給ContextBuilder或「openstack-nova」來創建上下文(實際上,openstack-nova是rackspace提供程序的傳遞依賴關係,因此您可以將它放在類路徑中如果你沒有明確聲明它)。你有什麼具體問題?