2012-02-17 90 views
6

我有scala.tools.sbt问题斯卡拉SBT:scala.tools.nsc没有运行

斯卡拉文件

在这里,我使用的解析器功能,使抽象语法树代码2 + 3

import scala.tools.nsc._ 
object Main extends App { 
    var i = new Interpreter 
    println(i.parse("2 + 3")) 
} 

SBT配置

name := "scalaSample" 

version := "1.0-SNAPSHOT" 

scalaVersion := "2.9.1" 

libraryDependencies += "org.scalatest" %% "scalatest" % "1.7.1" % "test" 

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

错误

无法初始化编译:找不到对象阶。 **请注意,截至2.8 scala并不假定使用java classpath。 **对于旧行为将-usejavacp传递给scala,或者如果以编程方式使用设置 **对象,则settings.usejavacp.value = true。

[error](run-main)java.lang.NullPointerException java.lang.NullPointerException at scala.tools.nsc.CompilationUnits $ CompilationUnit。 (CompilationUnits.scala:16)在 scala.tools.nsc.interpreter.ExprTyper $ $ codeParser .applyRule(ExprTyper.scala:22) 在 scala.tools.nsc.interpreter.ExprTyper $ $ codeParser .stmts(ExprTyper .scala:36) 在 scala.tools.nsc.interpreter.ExprTyper $$ anonfun $ $解析2.适用(ExprTyper.scala:47) 在 scala.tools.nsc.interpreter.ExprTyper $$ anonfun $ $解析2 。适用(ExprTyper.scala:46) 在 scala.tools.nsc.reporters.Reporter.withIncompleteHandler(Reporter.scala:46) 在 scala.tools.nsc.interpreter.ExprTyper $ class.parse(ExprTyper.scala :46) at scala.tools.nsc.interpreter.IMain $ exprTyper $ .parse(IMain.scala:1012) at scala.tools.nsc.interpreter.IMain.parse(IMain.scala:1013)at eu.semantiq.scalaToJS.Main $ delayedInit $ body.apply(Main。 Scala:7)at scala.Function0 $ class.apply $ mcV $ sp(Function0.scala:34)at scala.runtime.AbstractFunction0.apply $ mcV $ sp(AbstractFunction0.scala:12) at scala.App $ $ anonfun $ main $ 1.apply(App.scala:60)at scala.App $$ anonfun $ main $ 1.apply(App.scala:60)at scala.collection.LinearSeqOptimized $ class.foreach(LinearSeqOptimized.scala: 59) at scala.collection.immutable.List.foreach(List.scala:45)at scala.collection.generic.TraversableForwarder $ class.foreach(TraversableForwarder.scala:30) at scala.App $ class.main( App.scala:60)在 eu.semantiq.scalaToJS.Main $。主要(Main.scala:5)在 sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法) eu.semantiq.scalaToJS.Main.main(Main.scala)在 太阳.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在java.lang.reflect.Method.invoke(Method.java:616) 的java .lang.RuntimeException:非零退出代码:1 at scala.sys.package $ .error(package。斯卡拉:27)

斯卡拉REPL一切正常

欢迎斯卡拉版本2.9.0.1(OpenJDK的64位服务器虚拟机,Java的 1.6.0_23)。键入表达式以评估它们。请输入:help获取更多信息。

阶>进口scala.tools.nsc._

进口scala.tools.nsc._

阶>变种I =新解释

警告:有4个弃用 警告;重新运行,弃用详情警告:有1 弃用警告;与-deprecation重新运行细节

I:scala.tools.nsc.Interpreter = [email protected]

阶>的println(i.parse( “2 + 3”) )

一些(表(2 $加(3)))

我觉得真的是我的英语不好

回答

4

根据对不起到xsbt的FAQ

SBT运行在同一个JVM测试,SBT本身和Scala类是不在同一个类加载器作为应用类 。

还有更多:

关键是要初始化设置使用 embeddedDefaults解释。

这里给出的例子使用了一些任意类型MyType。事实上,您可以使用任何类型来帮助找到适当的类加载器(请参阅this answer)。

因此,你的代码应该是这样的:

import scala.tools.nsc._ 

trait Foo // Arbitrary type added to get stuff working 

object Main extends App { 
    val settings = new Settings 
    settings.embeddedDefaults[Foo] 
    val interpreter = new Interpreter(settings) 
    println(interpreter.parse("2 + 3")) 
}