Scala 2.11.2 ScriptEngine throws error
-
21-12-2019 - |
题
I'm trying to run Scala ScriptEngine in InteliJ IDEA Scala Worksheet (Scala 2.11.2)
Next code:
import javax.script.ScriptEngineManager
val e = (new ScriptEngineManager()).getEngineByName("scala")
e.eval("1 to 10 foreach println")
Throws error:
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.sbt as follows:
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"
All needed dependencies included, I don't understand why it is don't work.
Same project in Eclipse Luna + Eclipse IDE 4 works fine!
How to run it in InteliJ IDEA?
解决方案
It looks like since IntelliJ launches differently than sbt, where I am assuming your code is working, you'll need to use something like the sample below. The only difference is the usejavacp line which is related to how IntelliJ launches java/scala projects versus something like sbt which does classLoader magic to launch them in the same vm.
val engine = new ScriptEngineManager().getEngineByName("scala")
val settings = engine.asInstanceOf[scala.tools.nsc.interpreter.IMain].settings
settings.embeddedDefaults[YourClass]
settings.usejavacp.value = true
The reasons for the embeddedDefaults is it brings the classLoader into scope.
Reference to the previous solution: https://stackoverflow.com/a/24351657/1951691
This set up works for me running as a test, I haven't used the worksheets but assume the launching mechanism is the same.
其他提示
I had to include Scala compiler to Project Structure | Global Libraries within Intellij