Embedded Scala REPL наследует родительский путь к классам

Как задано в этот поток в списке рассылки Scala, как я могу создать встроенный Scala REPL, который наследует путь к классам родительская программа? Предположим, что родительская программа Scala запущена с помощью scala -cp <classpath> ...; можно ли <classpath> получить доступ к строке в качестве строки и использовать для инициализации встроенного REPL? (Путь к классам Java, доступный через System.getProperty("java.class.path"), по-видимому, отличается от пути класса Scala.)

В качестве альтернативы, возможно, встроенный Scala REPL может наследовать или конструировать свой ClassLoader из родительского процесса (может быть, будет интересен разговор Майкла Дюрига ScalaDays 2010). Это рекомендуемый подход?

Ответы

Ответ 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, и вы сможете запустить отправку или любую другую библиотеку, в которой вы нуждаетесь.

Ответ 2

установите для свойства usejavacp значение true:

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

Ответ 3

Кажется, что нет простого способа доступа к "" из программы Scala (в отличие от "пути Java classpath" доступно через системное свойство java.class.path). Хотелось бы получить доступ, например, к полю Calculated.userClasspath в экземпляре scala.tools.PathResolver, но последнее не представляется доступным. Возможно, самый простой способ - изменить запуск scala script для хранения строки параметра -classpath в переменной среды.

Предполагая, что желаемый путь класса Scala может быть определен, его можно передать встроенному интерпретатору Scala через: settings.classpath.value = ...

Обновить: хотя строка класса Scala classpath не может быть непосредственно достигнута из среды выполнения Scala, @Eugene указывает, что ее можно извлечь из загрузчика классов. Спасибо.