5

Akka アクターを使用して scala でリモート アクター間で通信しようとしています。私のプログラムは 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
}
}
}

どんな助けでも大歓迎です。

ありがとう

4

1 に答える 1

0

ここでの問題は、Scala ディストリビューションのブート クラス パスにデフォルトで akka-actor 2.XX が含まれていることです。したがって、コード内のscalacscalaで使用されるものは異なります。

回避策は、scala の代わりに Java を使用してアプリケーションを起動することです。必要なのは、適切な Scala jar (scala-library と scala-compiler) をクラスパスに含めることだけです。

java -cp akka-remote_2.10-2.2.2.jar FileName.scala

akka-actor など、多くの jar 依存関係が存在します。

したがって、SBT を使用するか、すべての jar をフォルダーに入れてから、そのフォルダーをクラスパスに追加します。

java -cp ./jars/*:. FileName.scala
于 2020-05-21T09:22:03.163 に答える