【问题标题】:Jclouds with multiple providers具有多个提供商的 Jclouds
【发布时间】:2014-02-10 15:32:27
【问题描述】:

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

【问题讨论】:

    标签: java maven jclouds


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      我想通了,但忘记了我问过这个问题。这就是发生的事情。

      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>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-04-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-07-07
        • 1970-01-01
        相关资源
        最近更新 更多