风暴拉入陈旧的依赖关系

时间:2016-09-12 23:05:34

标签: apache-storm

我们正尝试从Storm 0.10.0升级到1.0.2,我们的项目使用kafka-spout

在版本之间,风暴社区将backtype.storm包名称更改为org.apache.storm包名称。

作为我们自己升级的一部分,我们不得不将storm-kafka的版本更改为1.0.2

但是当我在暴风雨中运行拓扑时,我收到了关于旧版本中缺少类的错误:

apache-storm-1.0.2/bin/storm \
 jar \
$jarFile \
org.apache.storm.flux.Flux \
$yamlFile \
--remote



+-         Apache Storm        -+
+-  data FLow User eXperience  -+
Version: 1.0.2
Parsing file: topology-config.yaml
333  [main] INFO  o.a.s.f.p.FluxParser - loading YAML from input stream...
335  [main] INFO  o.a.s.f.p.FluxParser - Not performing property substitution.
335  [main] INFO  o.a.s.f.p.FluxParser - Not performing environment variable substitution.
Exception in thread "main" java.lang.NoClassDefFoundError: backtype/storm/spout/MultiScheme
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:264)
    at org.apache.storm.flux.FluxBuilder.buildObject(FluxBuilder.java:291)
    at org.apache.storm.flux.FluxBuilder.buildComponents(FluxBuilder.java:350)
    at org.apache.storm.flux.FluxBuilder.buildTopology(FluxBuilder.java:75)
    at org.apache.storm.flux.Flux.runCli(Flux.java:153)
    at org.apache.storm.flux.Flux.main(Flux.java:98)
Caused by: java.lang.ClassNotFoundException: backtype.storm.spout.MultiScheme
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    ... 7 more

我不确定backtype.storm从哪里爬进我的代码库。

我查看了mvn dependency:tree0.10.0的所有代码库(以及backtype.storm),但是旧版本的内容无法找到。

我甚至从我的子依赖项中排除了所有storm-kafka版本,然后在storm-kafka上添加了显式依赖项,但它没有改变任何东西。

Maven似乎没有错,因为我在0.10*中看不到任何~/.m2/repository个版本:

ls ~/.m2/repository/org/apache/storm/*
~/.m2/repository/org/apache/storm/flux:
1.0.2

~/.m2/repository/org/apache/storm/flux-core:
1.0.2

~/.m2/repository/org/apache/storm/storm:
1.0.2

~/.m2/repository/org/apache/storm/storm-kafka:
1.0.2

显然暴风雨在这里做错了。

2 个答案:

答案 0 :(得分:0)

检查topology-config.yaml,从yaml文件中选择类名后,动态加载了类。

答案 1 :(得分:0)

所以问题是因为在我们的代码中使用着色的jar文件作为依赖项。 其中一个阴影jar文件使用了旧版本的风暴依赖,并且某种方式没有显示在mvn dependency:tree

在从阴影jar依赖项中排除风暴依赖项时,上述错误消失了。

TL; DR:我实际爆炸了最终的jar文件(使用jar -xvf final.jar)并在backtype/stormorg/apache/storm包中看到了重复的类,backtype/storm中的类正在获取也许是因为backtypeorg字典之前出现了? (在这一点上不确定,因为我希望在这种情况下优先考虑包名称。)