【问题标题】:Force Storm to use fat jar dependency instead of classpath defined dependency强制 Storm 使用 fat jar 依赖而不是类路径定义的依赖
【发布时间】:2015-05-28 03:49:55
【问题描述】:

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

这里是一些背景/细节:

  • joda-time 是有问题的依赖项,storm classpath 中包含 2.0,fat jar 中包含 2.7。
  • 使用mvn compile exec:java -Dstorm.topology=ClassName 运行拓扑似乎使用2.7 就好了。
  • 使用storm jar target/filename-jar-with-dependencies.jar ClassName 提交拓扑似乎使用2.0 而不是2.7。
  • filename-jar-with-dependencies.jar 是使用 mvn package 创建的:
    • joda-time 2.7 在依赖部分下的pom.xml
    • 当我执行jar tvf target/filename-jar-with-dependencies.jar | grep joda 时,找到了 2.7 的正确 joda 时间戳

我什至注意到这一点的原因是我在通过storm 命令提交拓扑时看到以下警告/错误:

WARN  com.amazonaws.services.s3.internal.S3MetadataResponseHandler - Unable to parse last modified date: Mon, 25 May 2015 13:23:29 GMT
java.lang.IllegalStateException: Joda-time 2.2 or later version is required, but found version: 2.0
    at com.amazonaws.util.DateUtils.handleException(DateUtils.java:156) ~[filename-jar-with-dependencies.jar:na]
    at com.amazonaws.util.DateUtils.parseRFC822Date(DateUtils.java:204) ~[filename-jar-with-dependencies.jar:na]
    at com.amazonaws.services.s3.internal.ServiceUtils.parseRfc822Date(ServiceUtils.java:78) ~[filename-jar-with-dependencies.jar:na]
    at com.amazonaws.services.s3.internal.AbstractS3ResponseHandler.populateObjectMetadata(AbstractS3ResponseHandler.java:115) ~[filename-jar-with-dependencies.jar:na]
    at com.amazonaws.services.s3.internal.S3ObjectResponseHandler.handle(S3ObjectResponseHandler.java:52) [filename-jar-with-dependencies.jar:na]
    at com.amazonaws.services.s3.internal.S3ObjectResponseHandler.handle(S3ObjectResponseHandler.java:30) [filename-jar-with-dependencies.jar:na]
    at com.amazonaws.http.AmazonHttpClient.handleResponse(AmazonHttpClient.java:1050) [filename-jar-with-dependencies.jar:na]
    at com.amazonaws.http.AmazonHttpClient.executeOneRequest(AmazonHttpClient.java:724) [filename-jar-with-dependencies.jar:na]
    at com.amazonaws.http.AmazonHttpClient.executeHelper(AmazonHttpClient.java:467) [filename-jar-with-dependencies.jar:na]
    at com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:302) [filename-jar-with-dependencies.jar:na]
    at com.amazonaws.services.s3.AmazonS3Client.invoke(AmazonS3Client.java:3672) [filename-jar-with-dependencies.jar:na]
    at com.amazonaws.services.s3.AmazonS3Client.getObject(AmazonS3Client.java:1160) [filename-jar-with-dependencies.jar:na]
Caused by: java.lang.IllegalArgumentException: Invalid format: "Mon, 25 May 2015 13:23:29 GMT" is malformed at "GMT"
    at org.joda.time.format.DateTimeFormatter.parseMillis(DateTimeFormatter.java:747) ~[joda-time-2.0.jar:2.0]
    at com.amazonaws.util.DateUtils.parseRFC822Date(DateUtils.java:202) ~[filename-jar-with-dependencies.jar:na]
    ... 15 common frames omitted

【问题讨论】:

  • 你有没有找到这个问题的真正答案?我遇到了同样的问题,我的胖 jar 的类被忽略了,有利于本地类路径

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


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    在我使用 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>
    

    这解决了我的问题。

    如果您查看“aws-sdk-java”的源代码,您将看到以下验证。 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);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-14
      • 2016-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-08
      相关资源
      最近更新 更多