2015-12-17 3 views
2

Я использую Akka Распределенная Опубликовать Подписка с Java, следуя this examples из документации

Но всякий раз, когда я запускаю мой код я получаю java.lang.NoClassDefFoundError: scala/Predef$any2stringadd$

It похоже, что он не может архивировать библиотеку scala, но я вижу библиотеку scala на вкладке зависимостей. Я также использую ту же версию для обеих зависимостей Akka.

Мои зависимости на pom.xml:

<dependencies> 
    <dependency> 
     <groupId>org.twitter4j</groupId> 
     <artifactId>twitter4j-core</artifactId> 
     <version>[4.0,)</version> 
    </dependency> 
    <dependency> 
     <groupId>org.twitter4j</groupId> 
     <artifactId>twitter4j-stream</artifactId> 
     <version>[4.0,)</version> 
    </dependency> 
    <dependency> 
     <groupId>org.apache.kafka</groupId> 
     <artifactId>kafka_2.10</artifactId> 
     <version>0.8.2.2</version> 
    </dependency> 
    <dependency> 
     <groupId>org.apache.zookeeper</groupId> 
     <artifactId>zookeeper</artifactId> 
     <version>3.4.6</version> 
    </dependency> 
    <dependency> 
     <groupId>org.apache.storm</groupId> 
     <artifactId>storm-core</artifactId> 
     <version>0.10.0</version> 
    </dependency> 
    <dependency> 
     <groupId>org.apache.storm</groupId> 
     <artifactId>storm-kafka</artifactId> 
     <version>0.10.0</version> 
    </dependency> 
    <dependency> 
     <groupId>com.fasterxml.jackson.core</groupId> 
     <artifactId>jackson-databind</artifactId> 
     <version>2.6.4</version> 
    </dependency> 
    <dependency> 
     <groupId>com.typesafe.akka</groupId> 
     <artifactId>akka-actor_2.11</artifactId> 
     <version>2.4.1</version> 
    </dependency> 
    <dependency> 
     <groupId>com.typesafe.akka</groupId> 
     <artifactId>akka-cluster-tools_2.11</artifactId> 
     <version>2.4.1</version> 
    </dependency> 
</dependencies> 

И IntelliJ показывает:

enter image description here

Это код, который вызывает исключение:

ActorSystem actorSystem = ActorSystemManager.INSTANCE.getActorSystem(); 
ActorRef actorSubscriber = actorSystem.actorOf(Props.create(TwitterSubscriber.class)); 

Где ActorSystemManager является сингл eton, чтобы пройти по актерской системе.

public enum ActorSystemManager { 
    INSTANCE; 

    private final ActorSystem actorSystem; 

    private ActorSystemManager() { 
     actorSystem = ActorSystem.create("localized_tweets"); 
    } 

    public ActorSystem getActorSystem() { 
     return actorSystem; 
    } 
} 

А вот полный трассировки стека:

Connected to the target VM, address: '127.0.0.1:51608', transport: 'socket' 
Exception in thread "main" java.lang.NoClassDefFoundError: scala/Predef$any2stringadd$ 
    at akka.actor.RootActorPath.<init>(ActorPath.scala:273) 
    at akka.event.Logging$StandardOutLogger.<init>(Logging.scala:800) 
    at akka.event.Logging$.<init>(Logging.scala:821) 
    at akka.event.Logging$.<clinit>(Logging.scala) 
    at akka.event.LoggingBus$class.setUpStdoutLogger(Logging.scala:74) 
    at akka.event.LoggingBus$class.startStdoutLogger(Logging.scala:90) 
    at akka.event.EventStream.startStdoutLogger(EventStream.scala:28) 
    at akka.actor.ActorSystemImpl.<init>(ActorSystem.scala:613) 
    at akka.actor.ActorSystem$.apply(ActorSystem.scala:143) 
    at akka.actor.ActorSystem$.apply(ActorSystem.scala:110) 
    at akka.actor.ActorSystem$.create(ActorSystem.scala:58) 
    at akka.actor.ActorSystem.create(ActorSystem.scala) 
    at com.dazito.twitter.akka.ActorSystemManager.<init>(ActorSystemManager.java:16) 
    at com.dazito.twitter.akka.ActorSystemManager.<clinit>(ActorSystemManager.java:11) 
    at com.dazito.twitter.Main.main(Main.java:36) 
Caused by: java.lang.ClassNotFoundException: scala.Predef$any2stringadd$ 
    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) 
    ... 15 more 
Disconnected from the target VM, address: '127.0.0.1:51608', transport: 'socket' 

Любая помощь на том, как я могу решить это исключение?

ответ

2

У вас конфликтующие зависимости: kafka_2.10 требует Scala 2.10, а akka-actor_2.11 требует Scala 2.11, а библиотеки не совместимы с бинарными. Вместо этого используйте kafka_2.11. (Хотя вы приняли другой ответ, если вы не измените зависимость Kafka, вы можете столкнуться с более похожими проблемами.)

Maven не может вам помочь, поскольку он не знает о версии Scala суффикс для библиотек и не относится к scala-library специально. Поэтому он не может заметить конфликт. Вы можете использовать SBT даже для проектов Java, если у вас есть зависимости Scala; или использовать

<properties><scala.version>2.11</scala.version></properties> 
... 
kafka_${scala.version} 
... 
akka-actor_${scala.version} 
3

Обновите свою библиотеку scala до версии 2.11.

+0

Я думал, что зависимости от Akka приведут к правильной версии библиотеки scala. Благодарю. – dazito

Смежные вопросы