Staramy się uaktualnić z wersji Storm 0.10.0 do 1.0.2 i nasz projekt wykorzystuje wylewka kafka
Między wersjami backtype.storm
nazwy pakietów zostały zmienione na org.apache.storm
nazwa-pakietu przez społeczność Storm.
W ramach naszej własnej aktualizacji musieliśmy się zmienić storm-kafka
w wersji 1.0.2
Ale kiedy uruchamiam topologię na burzy, pojawia się błąd dotyczący brakujących klas ze starszej wersji:
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
Nie jestem pewien skąd backtype.storm
wkrada się do mojej bazy kodu.
Przejrzałem całą bazę kodu (i mvn dependency:tree
) dla 0.10.0
i backtype.storm
ale nie można znaleźć tych ze starszej wersji.
Wykluczyłem nawet wszystko storm-kafka
wersje z moich zależności zależnych od dziecka, a następnie dodałem wyraźną zależność od storm-kafka
ale nic nie zmieniło.
Wydaje się, że Maven nie ponosi winy, ponieważ nie widzę żadnych 0.10*
wersje w moim ~/.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
Najwyraźniej burza robi tutaj coś złego.
Odpowiedzi:
0 dla odpowiedzi № 1Sprawdź swój topology-config.yaml
, Klasa jest ładowana dynamicznie po wybraniu nazwy klasy z pliku yaml.
0 dla odpowiedzi nr 2
Problem polegał na użyciu zacienionych plików jar jako zależności w naszym kodzie. Jeden z zacienionych plików jar używał starszej wersji zależności od burzy i jakoś tego nie pokazano w mvn dependency:tree
Po wykluczeniu zależności burzy od zależności zacienionego słoika powyższy błąd zniknął.
TL; DR: Faktycznie rozbiłem plik jar (używając jar -xvf final.jar
) i widział duplikaty klas w backtype/storm
i org/apache/storm
pakiety i klasy w backtype/storm
byli odbierani, być może dlatego backtype
nadchodzi wcześniej org
leksykograficznie? (Nie jestem pewien w tej sprawie, ponieważ w takich przypadkach spodziewałbym się, że nazwa pakietu będzie miała pierwszeństwo).