2010-11-08 56 views
8

如在Scala郵件列表中的this thread中所述,我如何創建一個嵌入式Scala REPL,它繼承父程序的類路徑?假設父級Scala程序使用scala -cp <classpath> ...啓動;可以將<classpath>作爲字符串訪問並用於初始化嵌入式REPL? (該的Java類路徑,通過System.getProperty("java.class.path")可用,似乎從Scala的類路徑有所不同。)嵌入式Scala REPL繼承父類路徑

或者,也許嵌入式斯卡拉REPL可以繼承或從父進程構建其類加載器(邁克爾Dürig的ScalaDays 2010的談話可能有關)。這是推薦的方法嗎?

+0

我從來沒有聽說過斯卡拉翻譯。我在哪裏可以得到它? – ziggystar 2011-06-26 19:20:06

+0

解釋器我的意思是Scala REPL。它帶有Scala編譯器。這是從命令行執行'scala'可執行文件時得到的結果。這個問題是關於在正在運行的Scala程序中嵌入REPL的。 – 2011-06-27 04:20:42

+0

我編輯了你的答案,以反映你的意思是REPL。 – ziggystar 2011-06-27 07:10:31

回答

6

我試圖做同樣的事情,我只是找到了一種方法我出由Googling

lazy val urls = java.lang.Thread.currentThread.getContextClassLoader match { 
    case cl: java.net.URLClassLoader => cl.getURLs.toList 
    case _ => error("classloader is not a URLClassLoader") 
} 
lazy val classpath = urls map {_.toString} 

上面的代碼可以讓你在當前上下文類路徑。

settings.classpath.value = classpath.distinct.mkString(java.io.File.pathSeparator) 

把它放到你的settings.classpath中,你應該能夠啓動調度或任何你需要的庫。

+0

謝謝,這很有用。我已經解決的解決方法是使用Java類路徑環境變量(即'$ CLASSPATH')而不是Scala類路徑。 Java類路徑由嵌入式解釋器繼承,然後使用「usejavacp」選項。 – 2011-06-26 21:52:10

2

設置usejavacp屬性爲true:

val settings = new scala.tools.nsc.Settings 
settings.usejavacp.value = true 
+0

這種技術似乎沒有將_Scala_類路徑添加到新創建的解釋器中。如'scala.tools.nsc.StandardScalaSettings.scala'中所記錄,此選項僅包含classpath解析中的'java.class.path'。 – 2010-11-08 21:41:49

+0

查看https://lampsvn.epfl.ch/trac/scala/wiki/Classpath和http://lampsvn.epfl.ch/svn-repos/scala/scala-msil/trunk/上的相關源代碼src/compiler/scala/tools/util/PathResolver.scala 這些描述當前的類路徑處理相當詳細。 – michid 2010-11-09 09:19:15

+0

我不確定如何使用此信息。有沒有辦法在當前執行的程序中訪問scala.tools.util.PathResolver的實例?如果是這樣,我可以重用它的設置對象爲我創建的嵌入式解釋器。 – 2010-11-10 20:57:50

1

似乎沒有要訪問「Scala的類路徑」從運行的Scala程序中(與一個簡單的方法,在「Java類路徑」是通過java.class.path系統屬性可用)。人們想要訪問例如在scala.tools.PathResolver的情況下的字段Calculated.userClasspath,但後者似乎不可訪問。也許最簡單的解決方法是修改scala啓動腳本以將-classpath參數字符串存儲在環境變量中。

假設所需的Scala類路徑可以被確定,它可以通過被傳遞到嵌入的Scala解釋: settings.classpath.value = ...

更新:雖然Scala的類路徑串可以不從Scala的運行時直接實現,@ Eugene指出,它可以從上下文類加載器中提取。謝謝。