我正在尝试使用Akka actor在scala中的远程actor之间进行通信。我的程序从scala IDE运行正常,但我无法从命令提示符运行它。在我的项目文件夹中,我有application.conf文件,scala文件和akka-remote_2.10-2.2.2.jar文件。我正在编译我的程序如下
scalac -cp akka-remote_2.10-2.2.2.jar FileName.scala
程序编译然后按如下方式运行
scala FileName
我收到以下错误
java.lang.ClassNotFoundException: akka.remote.RemoteActorRefProvider
at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:247)
at akka.actor.ReflectiveDynamicAccess$$anonfun$getClassFor$1.apply(Dynam
icAccess.scala:68)
at akka.actor.ReflectiveDynamicAccess$$anonfun$getClassFor$1.apply(Dynam
icAccess.scala:67)
at scala.util.Try$.apply(Try.scala:161)
at akka.actor.ReflectiveDynamicAccess.getClassFor(DynamicAccess.scala:67
)
at akka.actor.ReflectiveDynamicAccess.createInstanceFor(DynamicAccess.sc
ala:85)
at akka.actor.ActorSystemImpl.<init>(ActorSystem.scala:546)
at akka.actor.ActorSystem$.apply(ActorSystem.scala:111)
at akka.actor.ActorSystem$.apply(ActorSystem.scala:93)
at Project1Bonus2$.main(Project1Bonus2.scala:11)
at Project1Bonus2.main(Project1Bonus2.scala)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.
java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAcces
sorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at scala.tools.nsc.util.ScalaClassLoader$$anonfun$run$1.apply(ScalaClass
Loader.scala:71)
at scala.tools.nsc.util.ScalaClassLoader$class.asContext(ScalaClassLoade
r.scala:31)
at scala.tools.nsc.util.ScalaClassLoader$URLClassLoader.asContext(ScalaC
lassLoader.scala:139)
at scala.tools.nsc.util.ScalaClassLoader$class.run(ScalaClassLoader.scal
a:71)
at scala.tools.nsc.util.ScalaClassLoader$URLClassLoader.run(ScalaClassLo
ader.scala:139)
at scala.tools.nsc.CommonRunner$class.run(ObjectRunner.scala:28)
at scala.tools.nsc.ObjectRunner$.run(ObjectRunner.scala:45)
at scala.tools.nsc.CommonRunner$class.runAndCatch(ObjectRunner.scala:35)
at scala.tools.nsc.ObjectRunner$.runAndCatch(ObjectRunner.scala:45)
at scala.tools.nsc.MainGenericRunner.runTarget$1(MainGenericRunner.scala
:74)
at scala.tools.nsc.MainGenericRunner.process(MainGenericRunner.scala:96)
at scala.tools.nsc.MainGenericRunner$.main(MainGenericRunner.scala:105)
at scala.tools.nsc.MainGenericRunner.main(MainGenericRunner.scala)
我的application.conf文件如下。
akka {
actor {
provider = "akka.remote.RemoteActorRefProvider"
}
remote {
enabled-transports = ["akka.remote.netty.tcp"]
netty.tcp {
hostname = "127.0.0.1"
port = 9001
}
}
}
任何帮助都将不胜感激。
由于
答案 0 :(得分:0)
这里的问题是,默认情况下,Scala发行版的引导类路径中包含akka-actor2.X.X。因此,代码中 scalac 和 scala 使用的代码是不同的。
解决方法是使用Java而不是scala启动应用程序。您需要做的就是在类路径中包含正确的Scala jar(scala库和scala编译器)。
java -cp akka-remote_2.10-2.2.2.jar FileName.scala
将会有很多jar依赖项,例如akka-actor等。
因此,请使用SBT或将所有jar放在一个文件夹中,然后将该文件夹添加到类路径中。
java -cp ./jars/*:. FileName.scala