Scala SBT: scala.tools.nsc не работает - PullRequest
6 голосов
/ 17 февраля 2012

У меня проблема с scala.tools.sbt

файл scala

Здесь я использовал функциональность парсера для создания абстрактного синтаксического дерева кода 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"

Error

Не удалось инициализировать компилятор: объект scala не найден. ** Обратите внимание, что по состоянию на 2.8 scala не предполагает использование пути к классам Java. ** Для старого поведения передайте -usejavacp в scala, или если вы используете настройки ** объект программно, settings.usejavacp.value = true.

[ошибка] (run-main) java.lang.NullPointerException java.lang.NullPointerException в 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.Apply (ExprTyper.scala: 47) в scala.tools.nsc.interpreter.ExprTyper $$ anonfun $ синтаксического анализа $ 2.Apply (ExprTyper.scala: 46) в scala.tools.nsc.reporters.Reporter.withIncompleteHandler (Reporter.scala: 46) в scala.tools.nsc.interpreter.ExprTyper $ class.parse (ExprTyper.scala: 46) в scala.tools.nsc.interpreter.IMain $ exprTyper $ .parse (IMain.scala: 1012) в scala.tools.nsc.interpreter.IMain.parse (IMain.scala: 1013) в eu.semantiq.scalaToJS.Main $ delayedInit $ body.apply (Main.scala: 7) в scala.Function0 $ class.apply $ mcV $ sp (Function0.scala: 34) в scala.runtime.AbstractFunction0.apply $ мкВ $ зр (AbstractFunction0.scala: 12) в scala.App $$ anonfun $ main $ 1.применить (App.scala: 60) в scala.App $$ anonfun $ main $ 1.применить (App.scala: 60) в scala.collection.LinearSeqOptimized $ class.foreach (LinearSeqOptimized.scala: 59) в scala.collection.immutable.List.foreach (List.scala: 45) в scala.collection.generic.TraversableForwarder $ class.foreach (TraversableForwarder.scala: 30) в scala.App $ class.main (App.scala: 60) в eu.semantiq.scalaToJS.Main $ .main (Main.scala: 5) в eu.semantiq.scalaToJS.Main.main (Main.scala) в sun.reflect.NativeMethodAccessorImpl.invoke0 (собственный метод) в sun.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 при scala.sys.package $ .error (package.scala: 27)

В scala REPL все работает

Добро пожаловать в Scala версии 2.9.0.1 (64-битная серверная виртуальная машина OpenJDK, Java 1.6.0_23). Введите выражения для их оценки. Тип: помощь для получения дополнительной информации.

scala> import scala.tools.nsc ._

import scala.tools.nsc ._

scala> var i = new Interpreter

предупреждение: было 4 устаревших предупреждения; повторно запустите с -deprecation для подробных предупреждений: было 1 предупреждения об устаревании; повторно запустите с -deprecation для деталей

i: scala.tools.nsc.Interpreter = scala.tools.nsc.Interpreter@786bfd73

scala> println (i.parse ("2 + 3"))

Некоторые (List (2. $ плюс (3)))

Мне очень жаль моего плохого английского

1 Ответ

4 голосов
/ 17 февраля 2012

Согласно xsbt's FAQ :

sbt запускает тесты в той же JVM, что и сам sbt, а классы 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"))
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...