2014-02-10 40 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提供程序的传递依赖关系,因此您可以将它放在类路径中如果你没有明确声明它)。你有什么具体问题?