Scala内嵌REPL继承父类路径

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

或者,嵌入式Scala REPL可以从父进程继承或构建它的ClassLoader(Michael Dürig的ScalaDays 2010演讲可能是相关的)。这是推荐的方法吗?


我以前从未听说过Scala解释器。我在哪里可以获取它? - ziggystar
通过解释器,我是指Scala REPL。它随Scala编译器一起提供。当您从命令行执行scala可执行文件时,您将得到它。这个问题是关于在运行的Scala程序中嵌入一个REPL。 - Kipton Barros
我已经编辑了你的答案,以反映你的意思是 REPL。 - ziggystar
@ziggystar,“解释器”和“REPL”这两个词有些可以互换使用。例如:http://www.scala-lang.org/node/2097 - Kipton Barros
3个回答

6

我正在尝试做同样的事情,刚刚通过谷歌搜索找到了一种方法:

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}

以上代码可以获取当前上下文中的classpath。

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

将其放入您的settings.classpath中,您应该能够启动Dispatch或者您需要的任何库。

谢谢,这很有用。我定下来的解决方法是使用Java类路径环境变量(即$CLASSPATH)而不是Scala类路径。Java类路径被嵌入式解释器继承,然后“usejavacp”选项就能够工作了。 - Kipton Barros

2

usejavacp属性设置为true:

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

这种技术似乎没有将_Scala_类路径添加到新创建的解释器中。正如在scala.tools.nsc.StandardScalaSettings.scala文档中所述,此选项只包括java.class.path在类路径解析中。 - Kipton Barros
请查看 https://lampsvn.epfl.ch/trac/scala/wiki/Classpath 和相关源代码 https://lampsvn.epfl.ch/svn-repos/scala/scala-msil/trunk/src/compiler/scala/tools/util/PathResolver.scala,它们详细描述了当前的类路径处理。 - michid
我不确定如何使用这些信息。有没有一种方法可以访问当前正在执行的程序中scala.tools.util.PathResolver实例?如果可以,我可以重用其设置对象来创建嵌入式解释器。 - Kipton Barros

1

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

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接