3

I'm using Akka Distributed Publish Subscribe with Java, following this examples from the documentation

But whenever I run my code I get a java.lang.NoClassDefFoundError: scala/Predef$any2stringadd$

It seems it can't file the scala library but I can see the scala library on the dependencies tab. I'm also using the same version for both Akka dependencies.

My dependencies on the 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>

And IntelliJ shows:

enter image description here

This is the code that is causing the exception:

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

Where ActorSystemManager is a singleton to pass around the actor system.

public enum ActorSystemManager {
    INSTANCE;

    private final ActorSystem actorSystem;

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

    public ActorSystem getActorSystem() {
        return actorSystem;
    }
}

And here is the complete stack trace:

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'

Any help on how can I solve this exception?

dazito
  • 7,740
  • 15
  • 75
  • 117

2 Answers2

3

Update your scala library to 2.11 version.

vvg
  • 6,325
  • 19
  • 36
2

You have conflicting dependencies: kafka_2.10 requires Scala 2.10, while akka-actor_2.11 requires Scala 2.11, and the libraries aren't binary compatible. Use kafka_2.11 instead. (Though you have accepted the other answer, if you don't change the Kafka dependency, you can well run into more similar problems.)

Maven can't help you, because it doesn't know about the Scala version suffix convention for libraries and doesn't treat scala-library specially. So it can't notice the conflict. You may want to use SBT even for Java projects if you have Scala dependencies; or use

<properties><scala.version>2.11</scala.version></properties>
...
kafka_${scala.version}
...
akka-actor_${scala.version}
Alexey Romanov
  • 167,066
  • 35
  • 309
  • 487