我们正尝试从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:tree
和0.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
显然暴风雨在这里做错了。
答案 0 :(得分:0)
检查topology-config.yaml
,从yaml文件中选择类名后,动态加载了类。
答案 1 :(得分:0)
所以问题是因为在我们的代码中使用着色的jar文件作为依赖项。
其中一个阴影jar文件使用了旧版本的风暴依赖,并且某种方式没有显示在mvn dependency:tree
在从阴影jar依赖项中排除风暴依赖项时,上述错误消失了。
TL; DR:我实际爆炸了最终的jar文件(使用jar -xvf final.jar
)并在backtype/storm
和org/apache/storm
包中看到了重复的类,backtype/storm
中的类正在获取也许是因为backtype
在org
字典之前出现了? (在这一点上不确定,因为我希望在这种情况下优先考虑包名称。)