Reflect Toolbox 在 Scala 2.11 中工作,在 Scala 2.12 中不工作

Reflect Toolbox worked in Scala 2.11 not working in Scala 2.12

这段在 Scala 2.11 中有效的代码在 2.12 中无效:

import scala.reflect.runtime.universe
import scala.tools.reflect.ToolBox
val tb = universe.runtimeMirror(getClass.getClassLoader).mkToolBox()
tb.eval(tb.parse("""println("hello!")"""))

我收到以下错误,2.12 中发生了什么变化?

Exception in thread "main" java.lang.AbstractMethodError: scala.reflect.internal.SymbolPairs$Cursor.matches(Lscala/reflect/internal/Symbols$Symbol;)Z

注意:我必须添加到类路径 scala-compiler-2.12.2.jar

是否有可能,您将项目更新为 Scala 2.12,但在类路径中留下了对 scala-compiler 2.11 的依赖?

关于您的代码,2.12 中没有任何变化。为了让您的代码正常工作,您必须依赖于 scala-compiler.

这是一个使用 Scala 2.11 的 SBT 项目,没有 scala-compiler 依赖:

name := "q53391593"
organization := "sk.ygor.Whosebug"
version := "1.0-SNAPSHOT"
scalaVersion := "2.11.12" 

您的代码无法编译:object runtime is not a member of package reflectobject tools is not a member of package scalanot found: value universe

您需要添加对scala-compiler的依赖:

name := "q53391593"
organization := "sk.ygor.Whosebug"
version := "1.0-SNAPSHOT"
scalaVersion := "2.12.6" 
libraryDependencies += "org.scala-lang" % "scala-compiler" % scalaVersion.value

这会将两个额外的 jar 放在您的 classpat 上:scala-compiler:2.12.6:jarscala-reflect:2.12.6:jar。如果您不使用 SBT,请确保您自己包含它们。

此外,请注意 scalaVersion.value 的用法以指定库的版本。这可以防止将不兼容版本的 Scala 库混合在一起。