2013-05-12 29 views
9

Tôi googled rất nhiều và bây giờ hoàn toàn bị mắc kẹt. Tôi biết, có những câu hỏi tương tự nhưng hãy đọc đến cùng. Tôi đã thử tất cả các giải pháp được đề xuất và không có giải pháp nào hiệu quả.scala.tools.nsc.IMain trong Play 2.1

Tôi đang cố gắng sử dụng lớp IMain từ scala.tools.nsc trong dự án Play 2.1 (Sử dụng Scala 2.10.0).

điều khiển Mã

Đây là mã, nơi tôi cố gắng sử dụng IMain trong một WebSocket. Đây chỉ là để thử nghiệm.

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

Ngay sau khi một cái gì đó được gửi qua WebSocket lỗi sau sẽ được ghi lại bởi vở kịch:

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

Những gì tôi đã cố gắng cho đến nay

Tất cả điều này đã không làm việc:

  • Tôi đã bao gồm fork := true trong Build.scala
  • Một đối tượng Settings với:
    • embeddedDefaults[MyType]
    • usejavacp.value = true
  • Các soultion đề xuất như là câu trả lời đến Câu hỏi Embedded Scala REPL inherits parent classpath

Tôi không biết phải làm gì bây giờ.

+0

bạn đã thử một cái gì đó đơn giản như (scala.tools.nsc.interpreter.IMain mới()). Giải thích ("val x = 1") phù hợp ... – Iraklis

+0

@Iraklis vâng.Tôi đặt nó trong mã khởi tạo trong Global.scala. Thông báo lỗi tương tự. –

+0

Bạn cũng có thể muốn xem câu trả lời của tôi [ở đây] (http://stackoverflow.com/a/23925201/3686016) về vấn đề này. – Aniket

Trả lời

3

Vấn đề ở đây là sbt không thêm scala-library vào đường dẫn lớp. Cách giải quyết sau hoạt động. Đầu tiên tạo một thư mục lib trong thư mục dự án đầu (công ty mẹ của ứng dụng, conf vv) và sao chép có các scala-library.jar

Sau đó, bạn có thể sử dụng đoạn mã sau để lưu trữ một thông dịch viên:

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

Ở trên tạo ra bootclasspath bằng cách thêm vào lớp java thư viện scala. Nó không phải là một vấn đề với khung chơi nó đến từ sbt. Vấn đề tương tự xảy ra đối với bất kỳ dự án scala nào khi nó chạy với sbt. Thử nghiệm với một dự án đơn giản. Khi nó chạy từ nhật thực nó hoạt động tốt.

EDIT: Link to sample project demonstrating the above. '

+0

không hoạt động đối với tôi. bây giờ thông báo lỗi đã thay đổi thành 'scala.annotation.Annotation' từ' scala.runtime' ... nhưng vẫn là vấn đề tương tự. –

+1

bạn có thể không sao chép đúng scala-library.jar. nếu bạn muốn tôi không thể gửi cho bạn porject tôi được sử dụng. – Iraklis

+0

tôi đã sử dụng thư viện scala 2.10.0. điêu đo thật tuyệt vơi. bạn có thể tìm thấy địa chỉ thư của tôi trong tiểu sử của tôi. –

-1

Tôi tự hỏi nếu phản ánh jar là mất tích. Hãy thử thêm điều này quá trong appDependencies.

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

thật không may, điều đó đã không giúp ... :( –

Các vấn đề liên quan