scala.tools.nsc.IMain в Play 2.1

Я много гуглил и сейчас полностью застрял. Я знаю, что есть похожие вопросы, но, пожалуйста, дочитайте до конца. Я пробовал все предложенные решения, и ни одно из них не сработало.

Я пытаюсь использовать класс IMain из scala.tools.nsc в проекте Play 2.1 (с использованием Scala 2.10.0).

Код контроллера

Это код, в котором я пытаюсь использовать IMain в веб-сокете. Это только для тестирования.

object Scala extends Controller {
  def session = WebSocket.using[String] { request =>
    val interpreter = new IMain() 
    val (out,channel) = Concurrent.broadcast[String]
    val in = Iteratee.foreach[String]{ code =>
      interpreter.interpret(code) match {
        case Results.Error =>      channel.push("error")
        case Results.Incomplete => channel.push("incomplete")
        case Results.Success =>    channel.push("success")
      }      
    } 
    (in,out)
  }
}

Как только что-то отправляется через Websocket, при воспроизведении регистрируется следующая ошибка:

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

Build.scala

object ApplicationBuild extends Build {
  val appName         = "escalator"
  val appVersion      = "1.0-SNAPSHOT"

  val appDependencies = Seq(
    "org.scala-lang" % "scala-compiler" % "2.10.0"
  )

  val main = play.Project(appName, appVersion, appDependencies).settings(    
  )
}

Что я уже пробовал

Все это не сработало:

Я не знаю, что делать сейчас.


person Martin Ring    schedule 12.05.2013    source источник
comment
Вы пробовали что-то более простое, например (new scala.tools.nsc.interpreter.IMain()).interpret(val x = 1) match...   -  person Iraklis    schedule 13.05.2013
comment
@Ираклис, да. Я поместил это в код инициализации в Global.scala. То же сообщение об ошибке.   -  person Martin Ring    schedule 13.05.2013
comment
Вы также можете посмотреть мой ответ здесь по этому вопросу.   -  person Aniket    schedule 29.05.2014


Ответы (2)


Проблема здесь в том, что sbt не добавляет библиотеку scala в путь к классам. Работает следующий обходной путь. Сначала создайте папку lib в верхнем каталоге проекта (родительском приложении, conf и т. д.) и скопируйте туда scala-library.jar.

Затем вы можете использовать следующий код для размещения интерпретатора:

      val settings = new Settings
      settings.bootclasspath.value +=scala.tools.util.PathResolver.Environment.javaBootClassPath + File.pathSeparator + "lib/scala-library.jar"
      val in = new IMain(settings){
            override protected def parentClassLoader = settings.getClass.getClassLoader()
      }
     val res = in.interpret("val x = 1")

Вышеупомянутое создает bootclasspath, добавляя к классу java библиотеку scala. Это не проблема с игровым фреймворком, он исходит от sbt. Та же проблема возникает для любого проекта scala, когда он работает с sbt. Проверено на простом проекте. Когда он запускается из eclipse, он работает нормально.

EDIT: Ссылка на пример проекта, демонстрирующий вышеизложенное.`

person Iraklis    schedule 12.05.2013
comment
не работает для меня. теперь сообщение об ошибке изменилось на scala.annotation.Annotation с scala.runtime... но все та же проблема. - person Martin Ring; 13.05.2013
comment
возможно, вы не скопировали правильный scala-library.jar. если вы хотите, я не могу отправить вам porject, который я использовал. - person Iraklis; 13.05.2013
comment
я использовал scala-библиотеку 2.10.0. это было бы круто. вы можете найти мой адрес электронной почты в моем профиле. - person Martin Ring; 13.05.2013
comment
большое спасибо за ваши усилия! Я посмотрю на это сейчас. :) - person Martin Ring; 13.05.2013
comment
в порядке. Я только что запустил приложение и получил точно такую ​​же ошибку, когда открыл `/echo'. так что это должно иметь какое-то отношение к внешней настройке ... Я не знаю, что еще попробовать. :( - person Martin Ring; 13.05.2013
comment
какая у вас операционная система? возможно, попробуйте следующее вместо: напишите File.pathSeperator - person Iraklis; 13.05.2013
comment
давайте продолжим это обсуждение в чате - person Iraklis; 13.05.2013

Интересно, отсутствует ли отражающая банка. Попробуйте добавить это тоже в appDependencies.

"org.scala-lang" % "scala-reflect" % "2.10.0"
person huynhjl    schedule 13.05.2013
comment
к сожалению не помогло... :( - person Martin Ring; 13.05.2013