Динамически импортировать зависимости?
Можно ли добавить новые вещи в classpath (например, редактирование project.clj и запуск lein deps
) и затем импортировать его в существующую сессию Clojure?
Это без необходимости отсоединения, а затем снова подключиться.
2 ответа
Вы можете использовать гранат для загрузки новых библиотек и добавления их в путь к классам во время выполнения. Он не будет читать напрямую из вашего project.clj, но использует совместимый синтаксис (используя библиотеку Aether, которую Leiningen 2 использует для собственного разрешения зависимостей).
Использование выглядит так (цитируя пример README):
=> (add-dependencies
:coordinates '[[incanter "1.2.3"]]
:repositories (merge cemerick.pomegranate.aether/maven-central
{"clojars" "http://clojars.org/repo"}))
Тем не менее, вы должны иметь гранат непосредственно в вашем начальном пути к классу, прежде чем его можно будет использовать.
Я предполагаю, что под сеансом clojure вы подразумеваете REPL, начатый lein repl
,
Короткий ответ на ваш вопрос - нет, вы не можете этого сделать.
JVM поддерживает загрузчики классов, чтобы обеспечить эту функциональность динамической загрузки, а clojure использует их для поддержки определений динамических классов с помощью deftype
gen-class
и т.п.
Добавление новых сторонних классов (предположительно, нового jar-файла библиотеки) в путь к классам было бы ужасно сложным, если учесть, что вам придется раскрутить и заново создать уже используемые загрузчики классов.
Смотрите этот вопрос для более подробной информации о загрузке классов в clojure.