Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/391.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 具有多个提供者的Jclouds_Java_Maven_Jclouds - Fatal编程技术网

Java 具有多个提供者的Jclouds

Java 具有多个提供者的Jclouds,java,maven,jclouds,Java,Maven,Jclouds,我正在尝试在我的应用程序中使用Jclouds,以便它可以同时与多个提供者协作。具体来说,我正在尝试使用openstack nova提供程序和rackspace cloudservers us提供程序,以便在运行时在两个不同的云中配置节点。然而,似乎供应商正在互相践踏;当我在Maven构建中包括这两个依赖项时,Rackspace提供程序是提供程序列表中唯一可用的提供程序: <dependency> <groupId>org.apache.jclouds.prov

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

这应该可以很好地工作。您应该能够通过将rackspace cloudservers us传递给ContextBuilder或openstack nova来创建上下文事实上openstack nova是rackspace提供程序的一个可传递依赖项,因此即使您没有显式声明它,您也可以在类路径中拥有它。你有什么具体问题?

我想出来了,但忘了我问过这个问题。事情是这样的

jClouds提供者向Java ServiceLoader注册自己。这意味着META-INF/services目录中有一个小文件,它具有jClouds核心在运行时注入的提供程序类名。我正在制作一个带有阴影的胖罐子,这意味着这个文件的内容在最后一个罐子中被覆盖

这留下了一个条目而不是两个条目,因此在运行时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>