【问题标题】:object scala in compiler mirror not found - running Scala compiler programmatically未找到编译器镜像中的对象 scala - 以编程方式运行 Scala 编译器
【发布时间】:2015-03-12 03:00:46
【问题描述】:

运行一个带有 Java 7 的简单 SBT 项目(详情如下)并在命令行调用 sbt run(没有 IntelliJ 或任何东西)

来源

import scala.tools.nsc.{ Global, Settings }

object Playground extends App {
  val compiler = new Global(new Settings())
  val testFiles = List("Test.scala")
  val runner = new compiler.Run()
  val result = runner.compile(testFiles)
  println(result)
}

错误

error: error while loading Object, Missing dependency 'object scala in compiler mirror', required by /Library/Java/JavaVirtualMachines/jdk1.7.0_60.jdk/Contents/Home/jre/lib/rt.jar(java/lang/Object.class)
[error] (run-main-0) scala.reflect.internal.MissingRequirementError: object scala in compiler mirror not found.
scala.reflect.internal.MissingRequirementError: object scala in compiler mirror not found.
    at scala.reflect.internal.MissingRequirementError$.signal(MissingRequirementError.scala:17)
    at scala.reflect.internal.MissingRequirementError$.notFound(MissingRequirementError.scala:18)
    at scala.reflect.internal.Mirrors$RootsBase.getModuleOrClass(Mirrors.scala:53)
    at scala.reflect.internal.Mirrors$RootsBase.getModuleOrClass(Mirrors.scala:66)
    at scala.reflect.internal.Mirrors$RootsBase.getPackage(Mirrors.scala:173)
    at scala.reflect.internal.Definitions$DefinitionsClass.ScalaPackage$lzycompute(Definitions.scala:161)
    at scala.reflect.internal.Definitions$DefinitionsClass.ScalaPackage(Definitions.scala:161)
    at scala.reflect.internal.Definitions$DefinitionsClass.ScalaPackageClass$lzycompute(Definitions.scala:162)
    at scala.reflect.internal.Definitions$DefinitionsClass.ScalaPackageClass(Definitions.scala:162)
    at scala.reflect.internal.Definitions$DefinitionsClass.init(Definitions.scala:1388)
    at scala.tools.nsc.Global$Run.<init>(Global.scala:1053)
    <etc...>

build.sbt

scalaVersion := "2.11.4"

val scalaV = "2.11.4"

libraryDependencies ++= Seq(
  "org.scala-lang"    %   "scala-compiler"      % scalaV,
  "org.scala-lang"    %   "scala-library"       % scalaV,
  "org.scala-lang"    %   "scala-reflect"       % scalaV
)

java

$ java -version
java version "1.7.0_60-ea"
Java(TM) SE Runtime Environment (build 1.7.0_60-ea-b15)
Java HotSpot(TM) 64-Bit Server VM (build 24.60-b09, mixed mode)

【问题讨论】:

    标签: scala scalac scala-compiler


    【解决方案1】:

    这是你不得不说的:

    trait Probe
    
    object Playground extends App {
      //val compiler = new Global(new Settings())
      val s = new Settings()
      s.embeddedDefaults[Probe]
      val compiler = new Global(s)
      val testFiles = List("Test.scala")
      val runner = new compiler.Run()
      val result = runner.compile(testFiles)
      println(result)
    }
    

    这花了我几分钟。该方法名称“embeddedDefaults”与 sbt 中的任何方法一样神秘。

    MutableSettings 上的评论(暗示有副作用):

      /** Initializes these settings for embedded use by type `T`.
      * The class loader defining `T` should provide resources `app.class.path`
      * and `boot.class.path`.  These resources should contain the application
      * and boot classpaths in the same form as would be passed on the command line.*/
    

    缩进与源代码中的一样。

    【讨论】:

    • 那么这里发生了什么?调用 s.embeddedDefaults[Probe] 有副作用吗?
    • @JonathanNeufeld 添加了评论。
    【解决方案2】:

    我遇到了同样的问题。

    settings.usejavacp.value = true
    

    帮我解决了问题!

    【讨论】:

    • 我不得不对此表示赞同。它不仅是列出的最简单的选项,而且对我有用,而投票最多的答案却没有。
    【解决方案3】:

    @som-snytt 解决方案在一个干净的 sbt 项目中为我工作。它不适用于 akka-http 项目。这是我找到的手动解决方案(硬编码路径。应该将其调整为他的环境或将其放入 conf 文件)

    它只是告诉编译器在哪里可以找到用于编译的 scala 库

        val settings = new Settings()
        //didn't need this one:// settings.embeddedDefaults[Probe]
        settings.classpath.value = "/home/oz/.ivy2/cache/org.scala-lang/scala-compiler/jars/scala-compiler-2.11.8.jar:/home/oz/.ivy2/cache/org.scala-lang/scala-library/jars/scala-library-2.11.8.jar:/home/oz/.ivy2/cache/org.scala-lang/scala-reflect/jars/scala-reflect-2.11.8.jar:/home/oz/.ivy2/cache/org.scala-lang.modules/scala-xml_2.11/bundles/scala-xml_2.11-1.0.4.jar:/home/oz/.ivy2/cache/org.scala-lang.modules/scala-parser-combinators_2.11/bundles/scala-parser-combinators_2.11-1.0.4.jar"
        settings.bootclasspath append "/home/oz/.ivy2/cache/org.scala-lang/scala-library/jars/scala-library-2.11.8.jar:/home/oz/.ivy2/cache/org.scala-lang/scala-compiler/jars/scala-compiler-2.11.8.jar:/home/oz/.ivy2/cache/org.scala-lang/scala-reflect/jars/scala-reflect-2.11.8.jar:/home/oz/.ivy2/cache/org.scala-lang.modules/scala-xml_2.11/bundles/scala-xml_2.11-1.0.4.jar:/home/oz/.ivy2/cache/org.scala-lang.modules/scala-parser-combinators_2.11/bundles/scala-parser-combinators_2.11-1.0.4.jar:/home/oz/.ivy2/cache/jline/jline/jars/jline-2.12.1.jar"
    

    【讨论】:

    • 这对我来说似乎很可疑,但我会看看。
    • 实际上这只对我有用。 settings.embeddedDefaults 没有帮助。另外,我只是在我的案例中阅读了 MANIFEST Class-Path 并像 private val classPath = getManifestAttr("Class-Path","").replace(' ',':') private val settings = new Settings settings.usejavacp.value = true settings.classpath.append(classPath) settings.bootclasspath.append(classPath) 一样使用它
    【解决方案4】:

    我解决了,因为maven依赖错误:

    <dependency>
        <groupId>com.haizhi.spark</groupId>
        <artifactId>spark-assembly</artifactId>
        <version>1.6.1</version>
    </dependency>
    

    我去掉这个依赖,然后成功了!!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-11-30
      • 1970-01-01
      • 2017-02-09
      • 1970-01-01
      • 2021-01-21
      • 1970-01-01
      相关资源
      最近更新 更多