Единственное, что может помешать работе REPL, - это оператор с побочными эффектами верхнего уровня, который не должен запускаться, когда пространство имен требуется в REPL, и все же происходит в пространстве имен, которое может потребоваться (возможно, косвенно).требуется при REPL.Понятно, что это просто плохая идея (если она кажется в некотором роде полезной договоренностью - например, со сложными хуками для Leiningen) - пространство имен, вероятно, следует разделить на пространство имен, содержащее определения, и пространство имен скод побочного эффекта).
Естественный режим запуска приложения будет зависеть от того, к какому из следующих классов оно относится:
- основная точка входа в Clojure
- не возражайте против компиляции AOT кода Clojure
- предпочитайте избегать AOT
- главная точка входа в Java (с вещами Clojure, вызываемыми через
clojure.lang.RT
)
Для 1.1.естественным подходом будет использование :gen-class
пространства имен в качестве Main-Class
в банке приложения manifest.mf
.Затем вы можете использовать java -jar
(если это überjar / автономная банка) / java -cp <app's cp> app.main
, чтобы запустить его.Leiningen поможет с этим, если вы укажете свойство :main
в project.clj
;Видя, как это самый популярный инструмент для сборки, и его выбор в пользу поддержки этого подхода (насколько мне известно) не вызывает никакой критики, его, вероятно, можно назвать идиоматическим.Maven может сделать то же самое с обычным заклинанием pom.xml
с указанием основного класса.
Для 1.2 вы можете сделать то, что делает Leiningen: предоставить оболочку, вызывающую clojure.main
с чем-то вроде -e "(use 'app.core)(-main)"
, какаргументы.
Для 2. нет ничего специфичного для Clojure в запуске.