正如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谈话可能是相关的)。这是推荐的方法吗?
答案 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指出它可以从上下文类加载器中提取。感谢。