Force Storm使用fat jar依赖而不是classpath定义的依赖

时间:2015-05-28 03:49:55

标签: java maven jar apache-storm aws-sdk

如何告诉Storm使用胖子jar中包含的依赖项而不是Storm类路径中的依赖

以下是一些背景/细节:

  • response_msg.setCorrelationId( request_msg.id( ) ); 是有问题的依赖项,joda-time中包含2.0,胖jar中包含2.7。
  • 使用storm classpath运行拓扑似乎使用2.7就好了。
  • 使用mvn compile exec:java -Dstorm.topology=ClassName提交拓扑似乎使用2.0而不是2.7。
  • storm jar target/filename-jar-with-dependencies.jar ClassName是使用filename-jar-with-dependencies.jar创建的:
    • mvn package位于“依赖项”部分下的joda-time 2.7
    • 当我执行pom.xml
    • 时,会找到2.7的正确的joda时间戳

我甚至注意到这一点的原因是我在通过jar tvf target/filename-jar-with-dependencies.jar | grep joda命令提交拓扑时看到以下警告/错误:

storm

2 个答案:

答案 0 :(得分:1)

我在阅读this post后找到的一个解决方法是使用较新版本替换Storm joda-time目录中的库(在我的情况下为/lib),因为该目录中的所有.jar文件都显示默认为storm classpath

我希望有一个更好的答案,以防图书馆的两个版本因某种原因需要共存。

答案 1 :(得分:1)

在我使用Maven 3.3.3和Wildfly 9.0.0-RC2'的情况下,我需要在pom.xml中添加

<dependency>
   <groupId>joda-time</groupId>
   <artifactId>joda-time</artifactId>
   <version>2.8.1</version>
</dependency>

这解决了我的问题。

如果你看一下&#39; aws-sdk-java&#39;的源代码。您将看到以下验证。 https://github.com/aws/aws-sdk-java/blob/1.10.1/aws-java-sdk-core/src/main/java/com/amazonaws/util/DateUtils.java

/**
 * Returns the original runtime exception iff the joda-time being used
 * at runtime behaves as expected.
 *
 * @throws IllegalStateException if the joda-time being used at runtime
 * doens't appear to be of the right version.
 */
private static <E extends RuntimeException> E handleException(E ex) {
    if (JodaTime.hasExpectedBehavior())
        return ex;
    throw new IllegalStateException("Joda-time 2.2 or later version is required, but found version: " + JodaTime.getVersion(), ex);
}