1. Почему Uberjar работает не так, как REPL?
Причиной ошибки "NO_SOURCE_PATH" является то, что вы сейчас не находитесь в пространстве имен, которое определило 'foo.
Чтобы проиллюстрировать: если я оцениваю ваш код в своем REPL и выполняю его, он помещает меня в пространство имен contact-form.core
, как и следовало ожидать, поскольку REPL оценивается (ns contact-form.core)
, но если я переключаюсь на user
namespace и call -main
Я могу выдать ту же ошибку:
contact-form.core=> (-main)
foo's value is: Hello World!
nil
contact-form.core=> (ns user)
nil
user=> (contact-form.core/-main)
CompilerException java.lang.RuntimeException: Unable to resolve symbol: foo in this context, compiling:(NO_SOURCE_PATH:120)
user=>
Таким образом, указав точку входа main
для автономного выполнения uberjar (вне REPL), это эквивалентно вызову (contact-form.core/-main)
из пространства имен по умолчанию в вашем jar-файле, которое clojure.core
, потому что (ns contact-form.core
) не был оценен. Результат: main
может быть выполнен с полностью определенным (пространством имен) путем к функции, но ни один из символов из contact-form.core
недоступен в текущем пространстве имен по умолчанию.
2. Исправление
Решение состоит в том, чтобы сначала явно переключиться на ваше пространство имен .:
(defn -main [& args]
(use 'contact-form.core)
(some-func 'foo))