首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >具有多个提供者的Jclouds

具有多个提供者的Jclouds
EN

Stack Overflow用户
提问于 2014-02-10 15:32:27
回答 2查看 379关注 0票数 0

我试图在我的应用程序中使用Jclouds,以便它可以同时处理多个提供者。具体来说,我正在尝试使用“openstack”提供程序和"rackspace-cloudservers-us“提供程序,这样我就可以在运行时在两个不同的云中提供节点。但是,似乎提供程序正在相互践踏;当我在Maven构建中包含这两个依赖项时,Rackspace提供程序是提供程序列表中唯一可用的:

代码语言:javascript
复制
  <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的提供者吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-07-17 13:45:06

我想明白了,但忘了我问过这个问题。这就是发生的事。

jClouds提供者使用ServiceLoaders注册自己。这意味着在META-INF/services目录中有一个小文件,其中包含jClouds核心在运行时注入的提供者类名。我用Shade制作了一个胖罐子,这意味着这个文件的内容在最后一个JAR中被覆盖了。

这留下了一个条目,而不是两个条目,因此在运行时,jClouds无法找到另一个提供程序。我必须添加一个配置选项,以确保Shade没有踩出这个文件。这是我已经在为Spring做的事情,所以当我意识到jClouds在做什么时,它是一个非常简单的修复。

以下是我的插件配置对于任何好奇的人来说是什么样子的:

代码语言:javascript
复制
<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
EN

Stack Overflow用户

发布于 2014-07-16 08:39:17

那应该是完美的。您应该能够通过将" rackspace -cloudservers-us“传递给ContextBuilder或”openstack“来创建上下文(实际上,openstack是rackspace提供程序的一个传递依赖项,因此即使您没有显式声明它,也会在类路径中得到它)。你有什么具体的问题?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21681318

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档