【问题标题】:Embedded Scala REPL inherits parent classpath嵌入式 Scala REPL 继承父类路径
【发布时间】:2010-11-08 05:45:20
【问题描述】:

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

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

【问题讨论】:

  • 我以前从未听说过 Scala 解释器。我在哪里可以买到?
  • 解释器是指 Scala REPL。它带有 Scala 编译器。这是从命令行执行 scala 可执行文件时得到的。这个问题是关于在正在运行的 Scala 程序中嵌入 REPL。
  • 我已经编辑了您的答案以反映您的意思是 REPL。
  • @ziggystar 解释器和 REPL 这两个词在某种程度上可以互换。例如:scala-lang.org/node/2097

标签: scala


【解决方案1】:

我正在尝试做同样的事情,我刚刚通过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,您应该能够启动调度或您需要的任何库。

【讨论】:

  • 谢谢,这很有用。我确定的解决方法是使用 Java 类路径环境变量(即$CLASSPATH)而不是 Scala 类路径。 Java 类路径由嵌入式解释器继承,然后“usejavacp”选项起作用。
【解决方案2】:

usejavacp 属性设置为true:

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

【讨论】:

  • 这种技术似乎没有将 Scala 类路径添加到新创建的解释器中。如scala.tools.nsc.StandardScalaSettings.scala 中所述,此选项仅在类路径解析中包含java.class.path
  • 查看lampsvn.epfl.ch/trac/scala/wiki/Classpathlampsvn.epfl.ch/svn-repos/scala/scala-msil/trunk/src/compiler/… 上的相关源代码,它们非常详细地描述了当前的类路径处理。
  • 我不确定如何使用这些信息。有没有办法在当前执行的程序中访问 scala.tools.util.PathResolver 的实例?如果是这样,我可以为我正在创建的嵌入式解释器重用它的 Settings 对象。
【解决方案3】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-05-05
    • 2013-03-17
    • 1970-01-01
    • 2019-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-14
    相关资源
    最近更新 更多