csferi27
csferi27

Reputation: 83

Test in Eclipse works but sbt throws MissingRequirementError: object scala.runtime in compiler mirror not found

I am messing around with parsing and scala.tools.nsc.interactive.Global in Scala and I ran into a problem while executing tests under sbt. The tests run fine from Eclipse both with JUnitRunner and the ScalaTest plugin. After long time spent on Google I can't figure out how to fix this.

When I execute sbt test the following error is thrown:

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]   ...

The class under test

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
  }

}

The test

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"

Environment:

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"

Upvotes: 2

Views: 8369

Answers (2)

csferi27
csferi27

Reputation: 83

The scala-library.jar was not missing from the sbt's classpath but from the classpath of Global. Had to set it in code.

After modifying the source to

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")

the problem disappeared.

Thanks for the tip @blueberryfields!

Upvotes: 2

blueberryfields
blueberryfields

Reputation: 50488

It looks like the scala jar isn't in your classpath when running sbt - make sure to add scala-library.jar to your classpath before you run sbt.


Based on one of your comments, it looks like you're running on windows. you might be also running into runtime jar access errors there if the classpath contains strange characters or spaces, or permission errors (e.g., if eclipse is running under an admin account, while sbt isn't).


Try reordering your dependency list, to put scala-library ahead of scala-compiler. if that doesn't work, try the troubleshooting advice here.

Upvotes: 2

Related Questions