scala.tools.nsc.IMain в Play 2.1

Търсих много в гугъл и сега съм тотално блокиран. Знам, че има подобни въпроси, но моля, прочетете до края. Опитах всички предложени решения и нито едно не свърши работа.

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

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

Това е кодът, където се опитвам да използвам IMain в Websocket. Това е само за тестване.

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, следната грешка се регистрира от play:

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-library към пътя на класа. Следното заобиколно решение работи. Първо създайте папка lib в горната директория на проекта (родителя на app, 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, работи добре.

РЕДАКТИРАНЕ: Връзка към примерен проект, демонстриращ горното.`

person Iraklis    schedule 12.05.2013
comment
не работи за мен. сега съобщението за грешка се промени на scala.annotation.Annotation от scala.runtime... но все още същият проблем. - person Martin Ring; 13.05.2013
comment
може да не сте копирали правилния scala-library.jar. ако искате, не мога да ви изпратя поректа, който използвах. - person Iraklis; 13.05.2013
comment
използвах 2.10.0 scala-библиотека. това ще бъде страхотно. можете да намерите моя имейл адрес в моя профил. - 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

Чудя се дали отразяващият буркан липсва. Опитайте да добавите и това в appDependencies.

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