Eclipse中的测试工作但sbt抛出MissingRequirementError:找不到编译器镜像中的对象scala.runtime

时间:2014-03-26 16:57:48

标签: scala sbt

我正在解决Scala中的解析和scala.tools.nsc.interactive.Global,并且在sbt下执行测试时遇到了问题。使用JUnitRunnerScalaTest插件,Eclipse的测试运行良好。在Google上花了很长时间后,我无法弄清楚如何解决这个问题。

当我执行sbt test时,会抛出以下错误:

Exception encountered when attempting to run a suite with class name: compileutils.CompileTest *** ABORTED ***
[info]   java.lang.ExceptionInInitializerError:
[info]   at compileutils.CompileTest$$anonfun$3.apply$mcV$sp(CompileTest.scala:18)
[info]   at compileutils.CompileTest$$anonfun$3.apply(CompileTest.scala:16)
[info]   at compileutils.CompileTest$$anonfun$3.apply(CompileTest.scala:16)
[info]   at org.scalatest.Transformer$$anonfun$apply$1.apply(Transformer.scala:22)
[info]   at org.scalatest.Transformer$$anonfun$apply$1.apply(Transformer.scala:22)
[info]   at org.scalatest.OutcomeOf$class.outcomeOf(OutcomeOf.scala:85)
[info]   at org.scalatest.OutcomeOf$.outcomeOf(OutcomeOf.scala:104)
[info]   at org.scalatest.Transformer.apply(Transformer.scala:22)
[info]   at org.scalatest.Transformer.apply(Transformer.scala:20)
[info]   at org.scalatest.FunSuiteLike$$anon$1.apply(FunSuiteLike.scala:158)
[info]   ...
[info]   Cause: scala.reflect.internal.MissingRequirementError: object scala.runtime in compiler mirror not found.
[info]   at scala.reflect.internal.MissingRequirementError$.signal(MissingRequirementError.scala:16)
[info]   at scala.reflect.internal.MissingRequirementError$.notFound(MissingRequirementError.scala:17)
[info]   at scala.reflect.internal.Mirrors$RootsBase.getModuleOrClass(Mirrors.scala:48)
[info]   at scala.reflect.internal.Mirrors$RootsBase.getModuleOrClass(Mirrors.scala:40)
[info]   at scala.reflect.internal.Mirrors$RootsBase.getModuleOrClass(Mirrors.scala:61)
[info]   at scala.reflect.internal.Mirrors$RootsBase.getPackage(Mirrors.scala:172)
[info]   at scala.reflect.internal.Mirrors$RootsBase.getRequiredPackage(Mirrors.scala:175)
[info]   at scala.reflect.internal.Definitions$DefinitionsClass.RuntimePackage$lzycompute(Definitions.scala:183)
[info]   at scala.reflect.internal.Definitions$DefinitionsClass.RuntimePackage(Definitions.scala:183)
[info]   at scala.reflect.internal.Definitions$DefinitionsClass.RuntimePackageClass$lzycompute(Definitions.scala:184)
[info]   ...

受测试的课程

package compileutils

import scala.tools.nsc.Settings
import scala.tools.nsc.interactive.Global
import scala.tools.nsc.reporters.ConsoleReporter
import scala.tools.nsc.interactive.Response
import scala.io.Source
import scala.reflect.internal.util.SourceFile
import scala.reflect.internal.util.BatchSourceFile
import scala.reflect.io.AbstractFile
import java.io.File

object Compile {
  val settings = new Settings
  val reporter = new ConsoleReporter(settings)
  val global = new Global(settings, reporter, "Study compile")

  def parse(source: String): Compile.this.global.Tree = {
    val sourceFile = new BatchSourceFile(".", source)
    global.askReload(List(sourceFile), new Response[Unit])

    global.parseTree(sourceFile)
  }

  def loadTypes(source: String): Either[Compile.this.global.Tree, Throwable] = {
    val sourceFile = new BatchSourceFile(".", source)
    val tResponse = new Response[global.Tree]
    global.askReload(List(sourceFile), new Response[Unit])
    global.askLoadedTyped(sourceFile, tResponse)

    tResponse.get
  }

}

测试

package compileutils

import org.scalatest.BeforeAndAfter
import org.junit.runner.RunWith
import org.scalatest.junit.JUnitRunner
import org.scalatest.FunSuite
import org.scalatest.Matchers._

@RunWith(classOf[JUnitRunner])
class CompileTest extends FunSuite with BeforeAndAfter {
  val testSource = "class FromString {val s = \"dsasdsad \"}"

  before {}
  after {}

  test("parse") {
    //when
    val tree = Compile.parse(testSource)

    //then
    tree should not be null
  }

  test("typer") {
    //when
    val typ = Compile.loadTypes(testSource)

    //then
    typ should be('left)
  }
}

build.sbt

name := "Compiler study"

version := "0.1"

val scalaBuildVersion = "2.10.3"

scalaVersion := scalaBuildVersion

libraryDependencies += "org.scala-lang" % "scala-compiler" % scalaBuildVersion

libraryDependencies += "org.scala-lang" % "scala-library" % scalaBuildVersion

libraryDependencies += "org.scala-lang" % "scala-reflect" % scalaBuildVersion

libraryDependencies += "org.scalatest" %% "scalatest" % "2.1.0" % "test"

libraryDependencies += "junit" % "junit" % "4.11" % "test"

环境:

sbt launcher version 0.13.0
Scala compiler version 2.10.3 -- Copyright 2002-2013, LAMP/EPFL
javac 1.6.0_45
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=13.10
DISTRIB_CODENAME=saucy
DISTRIB_DESCRIPTION="Ubuntu 13.10"

2 个答案:

答案 0 :(得分:2)

运行sbt时,看起来scala jar不在你的类路径中 - 确保在运行sbt之前将scala-library.jar添加到类路径中。


根据您的一条评论,看起来您正在Windows上运行。如果类路径包含奇怪的字符或空格,或者权限错误(例如,如果eclipse在管理员帐户下运行,而sbt不是),则可能还会遇到运行时jar访问错误。


尝试重新排序依赖项列表,将scala-library放在scala-compiler之前。如果不起作用,请尝试使用故障排除建议here

答案 1 :(得分:2)

sbt的类路径中没有丢失scala-library.jar,而是来自Global的类路径。不得不在代码中设置它。

将源修改为

val settings = new Settings

val scalaLibraryPath = "/home/csajka/.ivy2/cache/org.scala-lang/scala-library/jars/scala-library-2.10.3.jar"
settings.bootclasspath.append(scalaLibraryPath)
settings.classpath.append(scalaLibraryPath)

val reporter = new ConsoleReporter(settings)
val global = new Global(settings, reporter, "Study compile")
问题消失了。

感谢提示@blueberryfields!