Встроенный Scala REPL наследует родительский путь к классам - PullRequest
8 голосов
/ 08 ноября 2010

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

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

Ответы [ 3 ]

6 голосов
/ 26 июня 2011

Я пытаюсь сделать то же самое, и я только что нашел выход, 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 голосов
/ 08 ноября 2010

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

val settings = new scala.tools.nsc.Settings
settings.usejavacp.value = true
1 голос
/ 30 ноября 2010

Похоже, не существует простого способа получить доступ к «пути к классам Scala» из запущенной программы Scala (напротив, «путь к классам Java» доступен через системное свойство java.class.path). Можно обратиться, например, к полю Calculated.userClasspath в случае scala.tools.PathResolver, но последнее не представляется доступным. Возможно, самый простой обходной путь - изменить сценарий запуска scala, чтобы сохранить строку параметра -classpath в переменной среды.

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...