我有scala.tools.sbt的问题
斯卡拉文件
在这里,我使用解析器功能来制作代码的抽象语法树 2 + 3
import scala.tools.nsc._
object Main extends App {
var i = new Interpreter
println(i.parse("2 + 3"))
}
Run Code Online (Sandbox Code Playgroud)
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"
Run Code Online (Sandbox Code Playgroud)
错误
无法初始化编译器:找不到对象标量.**请注意,从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)
在scala REPL中一切正常
欢迎使用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"))
有些(名单(2 $加(3)))
我对自己糟糕的英语感到非常抱歉
根据 xsbt 的常见问题解答:
sbt 在与 sbt 本身相同的 JVM 中运行测试,并且 Scala 类与应用程序类不在同一个类加载器中。
还有更多:
关键是使用embeddedDefaults 初始化解释器的设置。
那里给出的示例使用某种任意类型MyType。事实上,您可以使用任何类型来帮助 sbt 找到合适的类加载器(请参阅此答案)。
因此,您的代码应如下所示:
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"))
}
Run Code Online (Sandbox Code Playgroud)