2013-06-04 60 views
2

我正在尝试使用我在各种网站上发现的一些信息编写一个基本的Scala REPL。我最基本的REPL实施看起来是这样的,自定义Scala REPL问题

import scala.tools.nsc.Settings 
import scala.tools.nsc.interpreter._ 

object BillyREPL extends App { 
    val settings = new Settings 
    settings.usejavacp.value = true 
    settings.deprecation.value = true 

    new ILoop().process(settings) 
} 

用下面的构建设置,

import sbt._ 
import sbt.Keys._ 

object BillyREPLBuild extends Build { 

    lazy val billyrepl = Project(
    id = "billyrepl", 
    base = file("."), 
    settings = Project.defaultSettings ++ Seq(
     name := "BillyREPL", 
     organization := "tv.yobriefcasts", 
     version := "0.1-SNAPSHOT", 
     scalaVersion := "2.10.1", 
     libraryDependencies ++= Seq(
     "org.scala-lang" % "scala-compiler" % "2.10.1", 
     "org.scala-lang" % "scala-library" % "2.10.1" 
    ) 
    ) 
) 
} 

尝试运行然而,这导致了一些警告和最终的错误(这我相信由最初所引起警告),

Welcome to Scala version 2.10.1 (Java HotSpot(TM) 64-Bit Server VM, Java 1.7.0_12-ea). 
Type in expressions to have them evaluated. 
Type :help for more information. 

scala> 
Failed to initialize compiler: object scala.annotation.Annotation 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. 

而试图读取/评估ANYING时的错误如下。我不确定这是否是由于一些额外的缺失依赖,并且我意识到错误消息表明这是不常见的,但是我想知道如果有人之前曾经处理过这个问题,是否在我打开问题之前?

2 

Failed to initialize the REPL due to an unexpected error. 
This is a bug, please, report it along with the error diagnostics printed below. 
java.lang.NullPointerException 
    at scala.tools.nsc.interpreter.ExprTyper$codeParser$.applyRule(ExprTyper.scala:24) 
    at scala.tools.nsc.interpreter.ExprTyper$codeParser$.stmts(ExprTyper.scala:35) 
    at scala.tools.nsc.interpreter.ExprTyper$$anonfun$parse$2.apply(ExprTyper.scala:43) 
    at scala.tools.nsc.interpreter.ExprTyper$$anonfun$parse$2.apply(ExprTyper.scala:42) 
    at scala.tools.nsc.reporters.Reporter.withIncompleteHandler(Reporter.scala:51) 
    at scala.tools.nsc.interpreter.ExprTyper$class.parse(ExprTyper.scala:42) 
    at scala.tools.nsc.interpreter.IMain$exprTyper$.parse(IMain.scala:1074) 
    at scala.tools.nsc.interpreter.IMain.parse(IMain.scala:1078) 
    at scala.tools.nsc.interpreter.IMain$$anonfun$showCodeIfDebugging$1.apply(IMain.scala:1168) 
    at scala.tools.nsc.interpreter.IMain$$anonfun$showCodeIfDebugging$1.apply(IMain.scala:1168) 
    at scala.tools.nsc.interpreter.IMain.beSilentDuring(IMain.scala:238) 
    at scala.tools.nsc.interpreter.IMain.showCodeIfDebugging(IMain.scala:1168) 
    at scala.tools.nsc.interpreter.IMain$ReadEvalPrint.compileAndSaveRun(IMain.scala:800) 
    at scala.tools.nsc.interpreter.IMain$ReadEvalPrint.compile(IMain.scala:761) 
    at scala.tools.nsc.interpreter.IMain.bind(IMain.scala:618) 
    at scala.tools.nsc.interpreter.IMain.bind(IMain.scala:661) 
    at scala.tools.nsc.interpreter.IMain$$anonfun$quietBind$1.apply(IMain.scala:660) 
    at scala.tools.nsc.interpreter.IMain$$anonfun$quietBind$1.apply(IMain.scala:660) 
    at scala.tools.nsc.interpreter.IMain.beQuietDuring(IMain.scala:232) 
    at scala.tools.nsc.interpreter.IMain.quietBind(IMain.scala:660) 
    at scala.tools.nsc.interpreter.ILoop$$anonfun$process$1$$anonfun$apply$mcZ$sp$2.apply$mcV$sp(ILoop.scala:838) 
    at scala.tools.nsc.interpreter.ILoopInit$class.runThunks(ILoopInit.scala:122) 
    at scala.tools.nsc.interpreter.ILoop.runThunks(ILoop.scala:42) 
    at scala.tools.nsc.interpreter.ILoopInit$class.postInitialization(ILoopInit.scala:95) 
    at scala.tools.nsc.interpreter.ILoop.postInitialization(ILoop.scala:42) 
    at scala.tools.nsc.interpreter.ILoopInit$$anonfun$createAsyncListener$1.apply$mcV$sp(ILoopInit.scala:63) 
    at scala.tools.nsc.interpreter.ILoopInit$$anonfun$createAsyncListener$1.apply(ILoopInit.scala:60) 
    at scala.tools.nsc.interpreter.ILoopInit$$anonfun$createAsyncListener$1.apply(ILoopInit.scala:60) 
    at scala.tools.nsc.io.package$$anon$3.call(package.scala:40) 
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334) 
    at java.util.concurrent.FutureTask.run(FutureTask.java:166) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603) 
    at java.lang.Thread.run(Thread.java:722) 
. 
+2

是否经由'SBT开始你的项目run',因为推出定制来自sbt的口译员不工作AFAIK。如果是这种情况,请尝试使用sbt-assembly构建独立程序,并查看是否正确启动。 –

+0

啊,就是这样。你想发布这个答案,所以我可以接受它吗? –

回答

3

一个问题,当你嵌入REPL和项目运行与SBT发生。由于类加载器问题(?),从sbt启动自定义解释器不起作用。

您可以尝试使用sbt-assembly构建独立程序,并查看是否启动正确。

+0

呃!这可以通过使Runner fork来解决吗? –

+0

这不是最好的答案。我在另一个回答中看到了你也推荐分叉的链接答案。遵循常见问题解答指令后,要使用'settings.embeddedDefaults',另一个规则是不要设置'usejavacp'。 –