0

我正在尝试在我的应用程序中使用 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 提供商?

4

2 回答 2

0

那应该可以完美地工作。您应该能够通过将“rackspace-cloudservers-us”传递给 ContextBuilder 或“openstack-nova”来创建上下文(实际上 openstack-nova 是 rackspace 提供程序的传递依赖项,因此您甚至可以在类路径中拥有它如果您没有明确声明它)。你有什么具体问题?

于 2014-07-16T08:39:17.413 回答
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>
于 2014-07-17T13:45:06.993 回答