Search code examples
scalaakkajruby

Unable to access Scala's Akka libraries in JRuby


I'm using jruby 1.7.12 (1.9.3p392) and I want to take advantage of the Scala Akka library. I'm aware of the Mikka gem, but I want to do this manually.

I've downloaded the Akka library "2.3.8" from http://akka.io/downloads/ (specifically the link "Akka 2.3.8 distribution for Scala 2.11").

Below is the file structure (one app.rb JRuby file and the rest is the downloaded Akka library)...

├── akka-2.3.8
|   ├── bin
|   ├── config
|   ├── deploy
|   ├── doc
│   ├── lib
│   │   ├── akka
│   │   │   ├── akka-actor_2.11-2.3.8.jar
│   │   │   ├── akka-agent_2.11-2.3.8.jar
│   │   │   ├── akka-camel_2.11-2.3.8.jar
│   │   │   ├── akka-cluster_2.11-2.3.8.jar
│   │   │   ├── akka-contrib_2.11-2.3.8.jar
│   │   │   ├── akka-dataflow_2.11-2.3.8.jar
│   │   │   ├── akka-durable-mailboxes-2.3.8.jar
│   │   │   ├── akka-file-mailbox_2.11-2.3.8.jar
│   │   │   ├── akka-kernel_2.11-2.3.8.jar
│   │   │   ├── akka-mailboxes-common_2.11-2.3.8.jar
│   │   │   ├── akka-multi-node-testkit_2.11-2.3.8.jar
│   │   │   ├── akka-persistence-experimental_2.11-2.3.8.jar
│   │   │   ├── akka-persistence-tck-experimental_2.11-2.3.8.jar
│   │   │   ├── akka-remote-tests_2.11-2.3.8.jar
│   │   │   ├── akka-remote_2.11-2.3.8.jar
│   │   │   ├── akka-slf4j_2.11-2.3.8.jar
│   │   │   ├── akka-testkit_2.11-2.3.8.jar
│   │   │   ├── akka-transactor_2.11-2.3.8.jar
│   │   │   ├── akka-zeromq_2.11-2.3.8.jar
│   │   │   ├── camel-core-2.10.3.jar
│   │   │   ├── config-1.2.1.jar
│   │   │   ├── guava-12.0.jar
│   │   │   ├── hamcrest-core-1.3.jar
│   │   │   ├── hawtjni-runtime-1.8.jar
│   │   │   ├── jna-3.0.9.jar
│   │   │   ├── jnr-constants-0.8.2.jar
│   │   │   ├── jsr305-1.3.9.jar
│   │   │   ├── junit-4.11.jar
│   │   │   ├── leveldb-0.5.jar
│   │   │   ├── leveldb-api-0.5.jar
│   │   │   ├── leveldbjni-1.7.jar
│   │   │   ├── leveldbjni-all-1.7.jar
│   │   │   ├── leveldbjni-linux32-1.5.jar
│   │   │   ├── leveldbjni-linux64-1.5.jar
│   │   │   ├── leveldbjni-osx-1.5.jar
│   │   │   ├── leveldbjni-win32-1.5.jar
│   │   │   ├── leveldbjni-win64-1.5.jar
│   │   │   ├── netty-3.8.0.Final.jar
│   │   │   ├── protobuf-java-2.5.0.jar
│   │   │   ├── scala-continuations-library_2.11-1.0.2.jar
│   │   │   ├── scala-reflect-2.11.0.jar
│   │   │   ├── scala-stm_2.11-0.7.jar
│   │   │   ├── scalatest_2.11-2.1.3.jar
│   │   │   ├── slf4j-api-1.7.5.jar
│   │   │   ├── uncommons-maths-1.2.2a.jar
│   │   │   └── zeromq-scala-binding_2.11-0.0.7-spark.jar
│   │   └── scala-library-2.11.4.jar
│   └── src
│       └── akka
│           ├── akka-actor_2.11-2.3.8-sources.jar
│           ├── akka-agent_2.11-2.3.8-sources.jar
│           ├── akka-camel_2.11-2.3.8-sources.jar
│           ├── akka-cluster_2.11-2.3.8-sources.jar
│           ├── akka-contrib_2.11-2.3.8-sources.jar
│           ├── akka-dataflow_2.11-2.3.8-sources.jar
│           ├── akka-durable-mailboxes-2.3.8-sources.jar
│           ├── akka-file-mailbox_2.11-2.3.8-sources.jar
│           ├── akka-kernel_2.11-2.3.8-sources.jar
│           ├── akka-mailboxes-common_2.11-2.3.8-sources.jar
│           ├── akka-multi-node-testkit_2.11-2.3.8-sources.jar
│           ├── akka-persistence-experimental_2.11-2.3.8-sources.jar
│           ├── akka-persistence-tck-experimental_2.11-2.3.8-sources.jar
│           ├── akka-remote-tests_2.11-2.3.8-sources.jar
│           ├── akka-remote_2.11-2.3.8-sources.jar
│           ├── akka-slf4j_2.11-2.3.8-sources.jar
│           ├── akka-testkit_2.11-2.3.8-sources.jar
│           ├── akka-transactor_2.11-2.3.8-sources.jar
│           └── akka-zeromq_2.11-2.3.8-sources.jar
└── app.rb

The contents of the app.rb file is...

require "java"

$CLASSPATH << "akka-2.3.8"
$: << File.join(File.dirname(__FILE__), "akka-2.3.8")

java_import java.lang.System
java_import "akka.actor.ActorRegistry"
java_import "akka.actor.Actors"
java_import "akka.actor.UntypedActor"

...I appreciate that (in JRuby) $CLASSPATH and the load path $: are mapped, but I thought I would try both.

Running app.rb causes the following error (importing java.lang.System is fine, the akka.actor.ActorRegistry is the first line that breaks)...

NameError: cannot load Java class akka.actor.ActorRegistry
         for_name at org/jruby/javasupport/JavaClass.java:1250
  get_proxy_class at org/jruby/javasupport/JavaUtilities.java:34
      java_import at file:/Users/markmcdonnell/.rubies/jruby-1.7.12/lib/jruby.jar!/jruby/java/core_ext/object.rb:26
              map at org/jruby/RubyArray.java:2409
      java_import at file:/Users/markmcdonnell/.rubies/jruby-1.7.12/lib/jruby.jar!/jruby/java/core_ext/object.rb:22
           (root) at size.rb:7

What is the problem here. Have I not downloaded the right files or am I not referencing them properly?


Solution

  • Maybe the << does not add all the individual jars to the classpath? You might have to look for something else to include all jars in lib and lib/akka. Unfortunately I don't know enough JRuby to tell you how to do it.

    Also: you are importing classes (ActorRegistry, Actors) that don't exist in Akka 2.3.8. Please check the latest API docs, and make sure you are not trying an Akka 1.x example (as ActorRegistry would indicate).

    So, the following seems to work, maybe you can use that as a starting point:

    require "java"
    
    $CLASSPATH << "akka-2.3.8/lib/scala-library-2.11.4.jar"
    $CLASSPATH << "akka-2.3.8/lib/akka/akka-actor_2.11-2.3.8.jar"
    $CLASSPATH << "akka-2.3.8/lib/akka/config-1.2.1.jar"
    
    java_import java.lang.System
    java_import "akka.actor.ActorRef"
    java_import "akka.actor.ActorSystem"
    java_import "akka.actor.Props"
    java_import "akka.actor.UntypedActor"