Динамически импортировать зависимости?

Можно ли добавить новые вещи в 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 использует их для поддержки определений динамических классов с помощью deftypegen-class и т.п.

Добавление новых сторонних классов (предположительно, нового jar-файла библиотеки) в путь к классам было бы ужасно сложным, если учесть, что вам придется раскрутить и заново создать уже используемые загрузчики классов.

Смотрите этот вопрос для более подробной информации о загрузке классов в clojure.

Другие вопросы по тегам