2015-01-14 23 views
10

Chạy w/một dự án đơn giản SBT w/Java 7 (xem chi tiết bên dưới) và cách gọi sbt run tại dòng lệnh (không IntelliJ hoặc bất cứ điều gì)đối tượng scala trong trình biên dịch gương không tìm thấy - chạy Scala biên dịch programatically

nguồn

import scala.tools.nsc.{ Global, Settings } 

object Playground extends App { 
    val compiler = new Global(new Settings()) 
    val testFiles = List("Test.scala") 
    val runner = new compiler.Run() 
    val result = runner.compile(testFiles) 
    println(result) 
} 

lỗi

error: error while loading Object, Missing dependency 'object scala in compiler mirror', required by /Library/Java/JavaVirtualMachines/jdk1.7.0_60.jdk/Contents/Home/jre/lib/rt.jar(java/lang/Object.class) 
[error] (run-main-0) scala.reflect.internal.MissingRequirementError: object scala in compiler mirror not found. 
scala.reflect.internal.MissingRequirementError: object scala in compiler mirror not found. 
    at scala.reflect.internal.MissingRequirementError$.signal(MissingRequirementError.scala:17) 
    at scala.reflect.internal.MissingRequirementError$.notFound(MissingRequirementError.scala:18) 
    at scala.reflect.internal.Mirrors$RootsBase.getModuleOrClass(Mirrors.scala:53) 
    at scala.reflect.internal.Mirrors$RootsBase.getModuleOrClass(Mirrors.scala:66) 
    at scala.reflect.internal.Mirrors$RootsBase.getPackage(Mirrors.scala:173) 
    at scala.reflect.internal.Definitions$DefinitionsClass.ScalaPackage$lzycompute(Definitions.scala:161) 
    at scala.reflect.internal.Definitions$DefinitionsClass.ScalaPackage(Definitions.scala:161) 
    at scala.reflect.internal.Definitions$DefinitionsClass.ScalaPackageClass$lzycompute(Definitions.scala:162) 
    at scala.reflect.internal.Definitions$DefinitionsClass.ScalaPackageClass(Definitions.scala:162) 
    at scala.reflect.internal.Definitions$DefinitionsClass.init(Definitions.scala:1388) 
    at scala.tools.nsc.Global$Run.<init>(Global.scala:1053) 
    <etc...> 

build.sbt

scalaVersion := "2.11.4" 

val scalaV = "2.11.4" 

libraryDependencies ++= Seq(
    "org.scala-lang" % "scala-compiler"  % scalaV, 
    "org.scala-lang" % "scala-library"  % scalaV, 
    "org.scala-lang" % "scala-reflect"  % scalaV 
) 

java

$ java -version 
java version "1.7.0_60-ea" 
Java(TM) SE Runtime Environment (build 1.7.0_60-ea-b15) 
Java HotSpot(TM) 64-Bit Server VM (build 24.60-b09, mixed mode) 

Trả lời

9

Đây là một trong những nơi bạn có thể nói:

trait Probe 

object Playground extends App { 
    //val compiler = new Global(new Settings()) 
    val s = new Settings() 
    s.embeddedDefaults[Probe] 
    val compiler = new Global(s) 
    val testFiles = List("Test.scala") 
    val runner = new compiler.Run() 
    val result = runner.compile(testFiles) 
    println(result) 
} 

Đó đã cho tôi một vài phút. Tên phương thức đó, "embeddedDefaults", khó hiểu như bất kỳ phương thức nào xuất phát từ sbt.

Các bình luận về MutableSettings (điều này cho thấy một tác dụng phụ):

/** Initializes these settings for embedded use by type `T`. 
    * The class loader defining `T` should provide resources `app.class.path` 
    * and `boot.class.path`. These resources should contain the application 
    * and boot classpaths in the same form as would be passed on the command line.*/ 

Các thụt đầu dòng là như trong mã nguồn.

+0

Vậy điều gì đang xảy ra ở đây? Có tác dụng phụ nào khi gọi s.embeddedDefaults [Probe]? –

+0

@JonathanNeufeld đã thêm nhận xét. –

3

giải pháp @ som-snytt làm việc cho tôi trong một dự án sbt sạch. Nó không hoạt động trên một dự án akka-http. đây là giải pháp thủ công tôi đã tìm thấy (hardcoded con đường. Người ta phải điều chỉnh nó để env mình hoặc đặt nó trong file conf)

Nó chỉ là nói cho trình biên dịch nơi để tìm libs scala cho biên soạn

val settings = new Settings() 
    //didn't need this one:// settings.embeddedDefaults[Probe] 
    settings.classpath.value = "/home/oz/.ivy2/cache/org.scala-lang/scala-compiler/jars/scala-compiler-2.11.8.jar:/home/oz/.ivy2/cache/org.scala-lang/scala-library/jars/scala-library-2.11.8.jar:/home/oz/.ivy2/cache/org.scala-lang/scala-reflect/jars/scala-reflect-2.11.8.jar:/home/oz/.ivy2/cache/org.scala-lang.modules/scala-xml_2.11/bundles/scala-xml_2.11-1.0.4.jar:/home/oz/.ivy2/cache/org.scala-lang.modules/scala-parser-combinators_2.11/bundles/scala-parser-combinators_2.11-1.0.4.jar" 
    settings.bootclasspath append "/home/oz/.ivy2/cache/org.scala-lang/scala-library/jars/scala-library-2.11.8.jar:/home/oz/.ivy2/cache/org.scala-lang/scala-compiler/jars/scala-compiler-2.11.8.jar:/home/oz/.ivy2/cache/org.scala-lang/scala-reflect/jars/scala-reflect-2.11.8.jar:/home/oz/.ivy2/cache/org.scala-lang.modules/scala-xml_2.11/bundles/scala-xml_2.11-1.0.4.jar:/home/oz/.ivy2/cache/org.scala-lang.modules/scala-parser-combinators_2.11/bundles/scala-parser-combinators_2.11-1.0.4.jar:/home/oz/.ivy2/cache/jline/jline/jars/jline-2.12.1.jar" 
+0

dường như đáng ngờ đối với tôi, nhưng tôi sẽ xem xét. –

+0

Thực ra điều này chỉ làm việc cho tôi. settings.embeddedDefaults không giúp ích gì. Ngoài ra tôi chỉ đọc MANIFEST Class-Path trong trường hợp của tôi và sử dụng nó như 'private val classPath = getManifestAttr (" Class-Path "," ") .thay thế ('', ':') cài đặt val riêng = new Settings settings.usejavacp.value = true settings.classpath.append (classPath)settings.bootclasspath.append (classPath) ' – abdolence

3

Tôi nhấn cùng một vấn đề.

settings.usejavacp.value = true 

giải quyết vấn đề cho tôi!

+0

Tôi phải upvote điều này. Nó không chỉ là lựa chọn đơn giản nhất mà nó còn làm việc cho tôi trong khi câu trả lời bình chọn hàng đầu thì không. –

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