Scala 2.11.2 ScriptEngine выдает ошибку

Я пытаюсь запустить Scala ScriptEngine в рабочей таблице InteliJ IDEA Scala (Scala 2.11.2)

Следующий код:

import javax.script.ScriptEngineManager
val e = (new ScriptEngineManager()).getEngineByName("scala")
e.eval("1 to 10 foreach println")

Выдает ошибку:

e: javax.script.ScriptEngine = scala.tools.nsc.interpreter.IMain@49049a04
[init] error: error while loading Object, Missing dependency 'object scala in compiler mirror', required by C:\Program Files\Java\jdk1.8.0_11\jre\lib\rt.jar(java/lang/Object.class)

Failed to initialize compiler: object scala in compiler mirror not found.
** Note that as of 2.8 scala does not assume use of the java classpath.
** For the old behavior pass -usejavacp to scala, or if using a Settings
** object programatically, settings.usejavacp.value = true.
scala.reflect.internal.MissingRequirementError: object scala in compiler mirror not found.
    at scala.reflect.internal.MissingRequirementError$.signal(D:/workspace/Poster/src/test.sc:13)
    at scala.reflect.internal.MissingRequirementError$.notFound(D:/workspace/Poster/src/test.sc:14)
    at scala.reflect.internal.Mirrors$RootsBase.getModuleOrClass(D:/workspace/Poster/src/test.sc:49)
    at scala.reflect.internal.Mirrors$RootsBase.getModuleOrClass(D:/workspace/Poster/src/test.sc:62)
    at scala.reflect.internal.Mirrors$RootsBase.getPackage(D:/workspace/Poster/src/test.sc:169)
    at scala.reflect.internal.Definitions$DefinitionsClass.ScalaPackage$lzycompute(D:/workspace/Poster/src/test.sc:157)
    at scala.reflect.internal.Definitions$DefinitionsClass.ScalaPackage(D:/workspace/Poster/src/test.sc:157)
    at scala.reflect.internal.Definitions$DefinitionsClass.ScalaPackageClass$lzycompute(D:/workspace/Poster/src/test.sc:158)
    at scala.reflect.internal.Definitions$DefinitionsClass.ScalaPackageClass(D:/workspace/Poster/src/test.sc:158)
    at scala.reflect.internal.Definitions$DefinitionsClass.init(D:/workspace/Poster/src/test.sc:1373)
    at scala.tools.nsc.Global$Run.<init>(D:/workspace/Poster/src/test.sc:1225)
    at scala.tools.nsc.interpreter.IMain.compileSourcesKeepingRun(D:/workspace/Poster/src/test.sc:384)
    at scala.tools.nsc.interpreter.IMain$ReadEvalPrint.compileAndSaveRun(D:/workspace/Poster/src/test.sc:803)
    at scala.tools.nsc.interpreter.IMain$ReadEvalPrint.compile(D:/workspace/Poster/src/test.sc:762)
    at scala.tools.nsc.interpreter.IMain.bind(D:/workspace/Poster/src/test.sc:626)
    at scala.tools.nsc.interpreter.IMain.bind(D:/workspace/Poster/src/test.sc:663)
    at scala.tools.nsc.interpreter.IMain$$anonfun$quietBind$1.apply(D:/workspace/Poster/src/test.sc:662)
    at scala.tools.nsc.interpreter.IMain$$anonfun$quietBind$1.apply(D:/workspace/Poster/src/test.sc:662)
    at #worksheet#.#worksheet#(D:/workspace/Poster/src/test.sc:200)

build.sb следующим образом:

name := "Poster"

version := "1.0"

libraryDependencies += "org.seleniumhq.selenium" % "selenium-java" % "2.42.2"

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

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

Все необходимые зависимости включены, я не понимаю, почему это не работает.

Тот же проект в Eclipse Luna + Eclipse IDE 4 работает нормально!

Как запустить его в InteliJ IDEA?


person Lunigorn    schedule 30.07.2014    source источник
comment
похоже, что рабочий лист intellij не улавливает зависимость scala-compiler. попробуйте сослаться на что-то в селене внутри рабочего листа. обратите внимание, что вам не нужна зависимость от библиотеки scala, sbt добавляет ее автоматически.   -  person Guillaume Massé    schedule 31.07.2014


Ответы (2)


Похоже, что поскольку IntelliJ запускается иначе, чем sbt, где я предполагаю, что ваш код работает, вам нужно будет использовать что-то вроде примера ниже. Единственным отличием является строка usejavacp, которая связана с тем, как IntelliJ запускает проекты java/scala по сравнению с чем-то вроде sbt, который использует магию classLoader для их запуска в той же виртуальной машине.

  val engine = new ScriptEngineManager().getEngineByName("scala")
  val settings = engine.asInstanceOf[scala.tools.nsc.interpreter.IMain].settings
  settings.embeddedDefaults[YourClass]
  settings.usejavacp.value = true

Причины для embeddedDefaults заключаются в том, что он вводит classLoader в область видимости.

Ссылка на предыдущее решение: https://stackoverflow.com/a/24351657/1951691

Эта настройка работает для меня в качестве теста, я не использовал рабочие листы, но предполагаю, что механизм запуска тот же.

person Dan D    schedule 17.09.2014

Мне пришлось включить компилятор Scala в структуру проекта | Глобальные библиотеки в Intellij

введите здесь описание изображения

person Arun Gopalpuri    schedule 12.11.2014