scala使用二进制发行版附带的akka,而不是sbt';是一个

scala使用二进制发行版附带的akka,而不是sbt';是一个,scala,sbt,akka,Scala,Sbt,Akka,我有一个项目在2.11_2.5.21版本中使用akka,它是我的胖罐子中的程序集 我已经下载了scala二进制文件2.11.12,它附带了一个lib/akka-actor_2.11-2.3.16.jar(在bin/scala旁边) 当我运行我的项目时:scala-cp target/scala-2.11/project-assembly-2.4.0.jar foo.MyClass java.lang.NoSuchMethodError: akka.actor.OneForOneStrategy.

我有一个项目在2.11_2.5.21版本中使用akka,它是我的胖罐子中的程序集

我已经下载了scala二进制文件2.11.12,它附带了一个
lib/akka-actor_2.11-2.3.16.jar
(在
bin/scala
旁边)

当我运行我的项目时:
scala-cp target/scala-2.11/project-assembly-2.4.0.jar foo.MyClass

java.lang.NoSuchMethodError: akka.actor.OneForOneStrategy.withMaxNrOfRetries(I)Lakka/actor/OneForOneStrategy;
如果我在scala目录中删除
lib/akka-actor_2.11-2.3.16.jar
,它就会工作

当然,它也可以与sbt一起运行,因为sbt使用自己的scala版本

为什么scala binary使用自己的akka版本而不是fat jar中提供的版本?

假设“scala binary”指的是say的解压缩结构

然后
lib/
中的所有内容都将优先于使用
-cp
指定的内容。要查看此内容,请分析下面的
bin/scala
runner脚本片段

execCommand \
  "${JAVACMD:=java}" \
  $JAVA_OPTS \
  "${java_args[@]}" \
  "${classpath_args[@]}" \
  -Dscala.home="$SCALA_HOME" \
  $OVERRIDE_USEJAVACP \
  "$EMACS_OPT" \
  $WINDOWS_OPT \
   scala.tools.nsc.MainGenericRunner  "$@"
请注意,
“${classpath\u args[@]}”
保存
lib
中的jar,位于最后一个
“$@”
之前,后者保存您的参数,如
-cp
。最后,JVM将选择它在类路径上找到的第一个匹配类,在您的例子中,它将是来自
lib/akka-actor_2.11-2.3.16.jar
的类。比如说

scala -cp target/scala-2.11/project-assembly-2.4.0.jar 
会扩展到

java -Xbootclasspath/a:/scala-2.11.12/lib/akka-actor_2.11-2.3.16.jar ... scala.tools.nsc.MainGenericRunner -cp target/scala-2.11/project-assembly-2.4.0.jar
因此
Xbootclasspath
将优先于
-cp

为什么Scala会包括Akka?另外,为什么要用Scala运行一个组装JAR?组装JAR的想法是只需要Java就可以执行它。
java -Xbootclasspath/a:/scala-2.11.12/lib/akka-actor_2.11-2.3.16.jar ... scala.tools.nsc.MainGenericRunner -cp target/scala-2.11/project-assembly-2.4.0.jar