2013-05-12 14 views
9

Dużo googlowałem i jestem całkowicie zablokowany. Wiem, że są podobne pytania, ale proszę, przeczytaj do końca. Próbowałem wszystkich proponowanych rozwiązań i żaden z nich nie działał.scala.tools.nsc.IMain w Play 2.1

Próbuję użyć klasy IMain z scala.tools.nsc w projekcie Play 2.1 (przy użyciu Scala 2.10.0).

kod kontrolera

Jest to kod, gdzie staram się używać IMain w websocket. To jest tylko do testowania.

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) 
    } 
} 

Jak tylko coś zostanie wysłany w ciągu websocket następujący błąd zostanie zarejestrowany przez zaawansowania:

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( 
) 
} 

Co Próbowałem tak daleko

Wszystko to nie działa:

Nie wiem, co teraz zrobić.

+0

próbowałeś coś prostszego jak nowy scala.tools.nsc.interpreter.IMain (()). Interpretacji ("val x = 1") mecz ... – Iraklis

+0

@Iraklis tak.Umieściłem to w kodzie inicjalizacyjnym w Global.scala. Ten sam komunikat o błędzie. –

+0

Możesz także zajrzeć do mojej odpowiedzi [tutaj] (http://stackoverflow.com/a/23925201/3686016) dotyczącej tego problemu. – Aniket

Odpowiedz

3

Problem polega na tym, że sbt nie dodaje scala-library do ścieżki klasy. Następujące obejście działa. Najpierw utwórz lib folderu w głównym katalogu projektu (rodzica aplikacji, conf etc) i skopiować tam scala-library.jar

Następnie można użyć następującego kodu do obsługi tłumacza:

 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") 

Powyższe tworzy bootclasspath, dodając do klasy java bibliotekę scala. Nie ma problemu ze strukturą gry, która pochodzi z sbt. Ten sam problem występuje w każdym projekcie scala, gdy działa z sbt. Przetestowano za pomocą prostego projektu. Kiedy działa od zaćmienia, jego prace są w porządku.

EDIT: Link to sample project demonstrating the above. `

+0

nie działa dla mnie. teraz komunikat o błędzie zmieniono na 'scala.annotation.Annotation' z' scala.runtime' ... ale wciąż ten sam problem. –

+1

mógłbyś nie skopiować poprawnej scala-library.jar. jeśli chcesz, nie mogę wysłać ci tego, którego użyłem. – Iraklis

+0

Użyłem biblioteki scala 2.10.0. to byłoby niesamowite. możesz znaleźć mój adres e-mail w moim profilu. –

-1

Zastanawiam się, czy słoik odzwierciedlać brakuje. Spróbuj dodać to również w appDependencies.

"org.scala-lang" % "scala-reflect" % "2.10.0" 
+0

Niestety, to nie pomogło ... :( –

Powiązane problemy