我想通了,但忘记了我问过这个问题。这就是发生的事情。
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>