嵌入式Scala REPL继承父类路径

时间:2010-11-08 05:45:20

标签: scala

正如Scala邮件列表中的this thread所述,如何创建一个继承父程序类路径的嵌入式Scala REPL?假设使用scala -cp <classpath> ...启动父Scala程序;可以<classpath>作为字符串访问并用于初始化嵌入的REPL吗? ( Java 类路径,可通过System.getProperty("java.class.path")获得,似乎与Scala类路径不同。)

或者,也许嵌入式Scala REPL可以从父进程继承或构造其ClassLoader(MichaelDürig的ScalaDays 2010谈话可能是相关的)。这是推荐的方法吗?

3 个答案:

答案 0 :(得分: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,您应该可以启动调度或任何您需要的库。

答案 1 :(得分:2)

usejavacp属性设置为true:

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

答案 2 :(得分:1)

似乎没有一种简单的方法可以从正在运行的Scala程序中访问“Scala类路径”(相反,“Java类路径”可以通过java.class.path系统属性获得)。例如,人们想要访问Calculated.userClasspath实例中的字段scala.tools.PathResolver,但后者似乎无法访问。也许最简单的解决方法是修改scala启动脚本以将-classpath参数字符串存储在环境变量中。

假设可以确定所需的Scala类路径,可以通过以下方式将其传递给嵌入式Scala解释器: settings.classpath.value = ...

更新:虽然Scala类路径字符串可能无法直接从Scala运行时获得,但@Eugene指出它可以从上下文类加载器中提取。感谢。