如何告诉Storm使用包含在fat jar中的依赖项而不是Storm类路径中的依赖项?
以下是一些背景/细节:
joda-time
是Storm类路径
中包含的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
我之所以注意到这一点,是因为我在通过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
在我使用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);
}
在阅读了这篇文章之后,我发现了一个解决办法,就是用新版本替换Storm的/lib
目录中的库(在我的例子中为joda-time
),因为默认情况下,该目录中的所有.jar文件都显示在Storm classpath
中。
我希望有一个更好的答案,以防库的两个版本由于这样或那样的原因需要共存。
上一章介绍了类型类的概念,这种模式使设计出来的程序既拥抱扩展性,又不放弃具体的类型信息。 这一章,我们还将继续探究 Scala 的类型系统,讲讲另一个特性, 这个特性可以将 Scala 与其他主流编程语言区分开:依赖类型,特别是,路径依赖的类型和依赖方法类型。 一个广泛用于反对静态类型的论点是 “the compiler is just in the way”, 最终得到的都是数据,为什么还要建立
一个项目在Google App Engine上运行。该项目具有依赖项,该依赖项使用的类由于安全限制而无法在应用程序引擎上调用(它不在白名单上)。我(非常有黑客感)的解决方案是将该类的修改版本复制到我的项目中(匹配原始类的名称和包),而不需要受限类。这在dev和live上都适用,我假设是因为我的源代码出现在外部依赖项之前的类路径中。 为了让它更干净一些,我决定将该类的修改版本放入它自己的项目中,该项
我有一个名为.jar的罐子,它依赖于我的外部库。 执行会得到以下输出, 我尝试用两种方式运行jar 并为DependedClass获得了NoClassDefFoundError 按如下所示更改清单条目后 清单-版本:1.0 创建-由:1.6.0_05(Sun Microsystems Inc.) 主-类:com.os.hw.helloworld 类-路径:c://users/vinay/deskt
我正在开发一个Java项目,使用maven作为依赖项管理器/构建工具。我当前在将依赖项的依赖项解析到正确版本时遇到问题。 有问题的依赖项称为JasperReports-Functions-6.1.0.jar,它不是托管在maven repo中,而是以jar形式提供的。 如何强制jar依赖项使用子依赖项的某个版本?
11.2 添加类路径依赖 Spring Boot提供了若干“启动器”,可以轻易地添加到类路径中。我们的示例程序在POM文件中的section部分已经使用了spring-boot-starter-parent。spring-boot-starter-parent是一个特殊的启动器,它提供了非常有帮助的Maven默认设置,还提供了dependency-management部分使得您可以省略依赖的ver
我给ivy添加了一个依赖项(我们称之为a)。在maven central中具有pom文件的xml。Ivy使用ibiblio来解析maven依赖项。添加到常春藤中的依赖项(A)。xml具有可传递依赖项(B)。到目前为止,一切都很好。传递依赖(B)的依赖(C)不能用常春藤来解决。 我在常春藤上定义了一个新的名字。如下所示的xml: 在B的pom文件中,C在编译和测试范围中定义如下: 当我在ivy的缓存