首页 文章

Scala SBT:scala.tools.nsc没有运行

提问于
浏览
6

我有 scala.tools.sbt 的问题

scala file

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

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

SBT configuration

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"

Error

无法初始化编译器:找不到对象标量 . **请注意,从2.8开始,scala不会假设使用java类路径 . **对于旧行为,将-usejavacp传递给scala,或者如果以编程方式使用Settings **对象,则settings.usejavacp.value = true . [error](run-main)scala.tools.nsc.CompilationUnits $ CompilationUnit中的java.lang.NullPointerException java.lang.NullPointerException . (CompilationUnits.scala:16)scala.tools.nsc.interpreter.ExprTyper $ codeParser $ .applyRule(ExprTyper.scala:22)at scala.tools.nsc.interpreter.ExprTyper $ codeParser $ .stmts(ExprTyper.scala:36) )scala.tools.nsc.interpreter.ExprTyper $$ anonfun $ parse $ 2.apply(ExprTyper.scala:47)at scala.tools.nsc.interpreter.ExprTyper $$ anonfun $ parse $ 2.apply(ExprTyper.scala:46 )scala.tools.nsc.report上的scala.tools.nsc.reporters.Reporter.withIncompleteHandler(Reporter.scala:46)scala.tools.nsc.interpreter.ExprTyper $ class.parse(ExprTyper.scala:46) . 在eu.semantiq.scalaToJS.Main $ delayedInit $ body.apply(Main.scala)的scala.tools.nsc.interpreter.IMain.parse(IMain.scala:1013)中的IMain $ exprTyper $ .parse(IMain.scala:1012) :7)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(Linea rSeqOptimized.scala:59)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)at eu.semantiq.scalaToJS.Main $ .main(Main.scala:5)at eu.semantiq.scalaToJS.Main.main(Main.scala)at sun.reflect.NativeMethodAccessorImpl.invoke0(Native方法)at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)at java.lang.reflect.Method.invoke(Method.java:616)java .lang.RuntimeException:非零退出代码:1在scala.sys.package $ .error(package.scala:27)

In scala REPL everything works

欢迎使用Scala版本2.9.0.1(OpenJDK 64位服务器VM,Java 1.6.0_23) . 输入表达式以对其进行评估 . 键入:帮助以获取更多信息 . scala> import scala.tools.nsc._ import scala.tools.nsc._ scala> var i = new解释器警告:有4个弃用警告;使用-deprecation重新运行以获取详细信息警告:有1个弃用警告;用-deprecation重新运行以获取详细信息i:scala.tools.nsc.Interpreter = scala.tools.nsc.Interpreter@786bfd73 scala> println(i.parse(“2 3”))some(List(2. $ plus( 3)))

我对自己糟糕的英语感到非常抱歉

1 回答

  • 4

    根据xsbt的FAQ

    sbt在与sbt本身相同的JVM中运行测试,并且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"))
    }
    

相关问题