我已经在 scala lang 论坛上发布了这个问题,但不幸的是我没有得到任何答案。第二次机会 ?
我尝试将一个解释器嵌入一个解释器并评估一个 scala 片段到这个解释器中。我想在解释器中绑定一个自定义类的实例。总而言之,这看起来像:
import scala.tools.nsc._
import scala.tools.nsc.interpreter._
class C {
def sayHello(s:String) = "hello "+s
}
object Main extends App {
val c= new C
val s = new Settings
s.usejavacp.value=true
val i = new IMain(s)
i.bind("myC",c)
i.bind("world","the world")
val script = "println(myC.sayHello(world))"
i.eval(script)
}
当我在 Eclipse (Kepler) 中运行此代码段时 - OpenJDK6/7 适用于两者 - BSD OS Scala-2.11.0-M4 - 路径中的 scala-compiler.jar 如果我尝试在 repl 中运行相同的代码,它工作正常或直接使用 scalac file.scala 然后 scala -cp 。主要我收到以下错误
error: not found value myC
javax.script.ScriptException: compile-time error
at scala.tools.nsc.interpreter.IMain.compile(IMain.scala:575)
at scala.tools.nsc.interpreter.IMain.eval(IMain.scala:997)
at javax.script.AbstractScriptEngine.eval(AbstractScriptEngine.java:264)
我能够使其在另一个操作系统(Win7)下工作,但通过添加 s.bootclasspath="path/to/my/classes"
我怀疑一些类路径问题
后来我能够通过用java调用替换scala命令行调用来使其运行:
java -cp $CLASSPATH Main
使用包含scala库的CLASSPATH它可以工作
我查看了 scala 命令,就像它以不同的方式在 java 路径中附加了 scala 库。
有人有什么建议吗?
谢谢
根据以下评论添加:
Scalac 不输出任何错误事实上,如果我运行:
java -cp .:$SCALA_PATH/lib/scala-library.jar:$SCALA_PATH/lib/scala-compiler.jar:$SCALA_PATH/lib/scala-reflect.jar Main
或者按照建议的 scala -nobootcp 它可以工作(感谢您的宝贵建议)否则,如果我让 scala 使用 bootcp,则开始的行是以下行并且它失败了
java -Xbootclasspath/a:/usr/home/pcohen/Dev/Scala/scala-2.11.0-M4/lib/akka-actors.jar[...] -classpath "" [...]
当 scala jar 附加到引导类路径时,就好像我的绑定失败了。我无法清楚地理解为什么这种引导类路径差异会影响我的课程。