【问题标题】:Test in Eclipse works but sbt throws MissingRequirementError: object scala.runtime in compiler mirror not found在 Eclipse 中测试有效,但 sbt 抛出 MissingRequirementError: object scala.runtime in compiler mirror not found
【发布时间】:2014-03-26 16:57:48
【问题描述】:

我在 Scala 中处理解析和 scala.tools.nsc.interactive.Global 问题,在 sbt 下执行测试时遇到了问题。使用JUnitRunnerScalaTest 插件,测试在Eclipse 中运行良好。在谷歌上花了很长时间后,我不知道如何解决这个问题。

当我执行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"

【问题讨论】:

    标签: scala sbt


    【解决方案1】:

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


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


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

    【讨论】:

    • 编译和测试类路径都包含 scala-library-2.10.3.jar 用 sbt 'show test:dependency-classpath' 和 sbt 'show compile:dependency-classpath' 检查它还是我在做什么错了吗?
    • 我看到的是 scala-reflect,而不是 scala-library。这是一个运行时,反射错误 - 当文件编译时你不会看到它。
    • 确实如此。列表(...,属性(/home/csajka/.ivy2/cache/org.scala-lang/scala-compiler/jars/scala-compiler-2.10.3.jar),属性(/home/csajka /.ivy2/cache/org.scala-lang/scala-library/jars/scala-library-2.10.3.jar),属性化(/home/csajka/.ivy2/cache/org.scala-lang /scala-reflect/jars/scala-reflect-2.10.3.jar), ...)
    【解决方案2】:

    scala-library.jar 并没有从 sbt 的类路径中丢失,而是从 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 的提示!

    【讨论】:

      猜你喜欢
      • 2013-04-26
      • 2014-05-12
      • 2020-10-24
      • 1970-01-01
      • 2018-12-29
      • 2020-02-18
      • 2022-12-19
      • 1970-01-01
      • 2018-03-05
      相关资源
      最近更新 更多