0

在 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 中发生了什么变化?

线程“主”java.lang.AbstractMethodError 中的异常:scala.reflect.internal.SymbolPairs$Cursor.matches(Lscala/reflect/internal/Symbols$Symbol;)Z

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

4

1 回答 1

1

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

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

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

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

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

您需要添加以下依赖项scala-compiler

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

这将在您的 classpat:scala-compiler:2.12.6:jarscala-reflect:2.12.6:jar. 如果您不使用 SBT,请确保您自己包含它们。

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

于 2018-11-20T11:43:44.097 回答