我正在尝试在我的应用程序中使用Jclouds,以便它可以同时与多个提供程序一起使用。具体来说,我正在尝试使用“openstack-nova”提供程序和“rackspace-cloudservers-us”提供程序,以便我可以在运行时在两个不同的云中配置节点。然而,似乎提供者互相踩踏;当我在Maven构建中包含两个依赖项时,Rackspace提供程序是提供程序列表中唯一可用的提供程序:
<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-nova工作。有没有办法让多个提供者同时使用Jclouds ?
答案 0 :(得分:0)
这应该完美无缺。您应该能够通过传递&#34; rackspace-cloudservers-us&#34;来创建上下文。到ContextBuilder或&#34; openstack-nova&#34; (实际上openstack-nova是机架空间提供者的传递依赖,因此即使你没有明确声明它,你也可以在类路径中使用它)。你有什么具体问题?
答案 1 :(得分: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>