2013-05-12 16 views
9

私はたくさんのグーグルで行きました。似たような質問がありますが、最後までお読みください。私はすべての提案された解決策を試してみましたが、うまくいきませscala.tools.nsc.IMain in Play 2.1

IMainクラスをPlay 2.1プロジェクト(Scala 2.10.0を使用)内で使用しようとしています。

コントローラコード

これは私がのWebSocketで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( 
) 
} 

このすべてがうまくいきませんでした:

  • 私はとBuild.scala
  • Settingsオブジェクトでfork := true含まれています:
    • embeddedDefaults[MyType]
    • usejavacp.value = true
  • soultionを答えとして提案します〜へ質問Embedded Scala REPL inherits parent classpath

私は今何をすべきか分かりません。

+0

は、あなたが(新しいscala.tools.nsc.interpreter.IMain())。解釈( "valをX = 1")マッチのような単純なものを試してみました... – Iraklis

+0

@Iraklisはい。私はそれをGlobal.scalaの初期化コードに入れました。同じエラーメッセージ。 –

+0

この問題に関して私の答え[ここ](http://stackoverflow.com/a/23925201/3686016)を見ることもできます。 – Aniket

答えて

3

ここでの問題は、sbtがクラスパスにscala-libraryを追加しないことです。 次の回避策が動作します。 まず、あなたが通訳をホストするために、次のコードを使用することができScalaの-library.jar

がトッププロジェクトディレクトリ(アプリの親、CONFなど)でフォルダのlibを作成してコピーします。

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

上記は、Javaクラスにscalaライブラリを追加することによって、bootclasspathを作成します。それはsbtから来るプレーフレームワークの問題ではありません。同じ問題がsbtで実行されているときに、どのスケーラプロジェクトにも発生します。簡単なプロジェクトでテストされています。それは日食から実行されるときにうまく動作します。

EDITLink to sample project demonstrating the above. `

+0

は私にとってはうまくいきません。エラーメッセージが 'scala.annotation.Annotation'から' scala.runtime' ...に変更されましたが、それでも同じ問題です。 –

+1

正しいscala-library.jarをコピーできない場合があります。あなたが私が使用したporjectを送ることができないようにしたい場合。 – Iraklis

+0

2.10.0スカラーライブラリを使用しました。それは素晴らしいだろう。私のプロフィールで私のメールアドレスを見つけることができます。 –

-1

反映jarファイルが欠落しているのだろうか。これもappDependenciesに追加してみてください。

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

残念ながら、それは役に立たなかった... :( –

関連する問題