Настройка кода Clojure в Eclipse как для REPL, так и для развертывания приложений - PullRequest
2 голосов
/ 19 февраля 2012

Я разрабатываю некоторый код Java + Clojure для Polyglot, используя большую часть времени REPL (в Eclipse с CounterClockwise и Maven). В этом контексте хорошо просто загрузить исходный код в REPL и начать взаимодействовать с кодом.

Однако в конечном итоге я хочу иметь возможность распространять и развертывать код в файлах .jar или аналогичных, чтобы его можно было запускать как отдельное приложение. В этом контексте код должен быть исполняемым как приложение Java с соответствующей функцией main(...). И я хотел бы, чтобы все это происходило чисто из файла Maven pom.xml.

Пока у меня есть код, работающий так, что у меня есть функция -main, которая не вызывается, когда я использую Clojure в REPL, но должна вызываться, когда она упакована / развернута как jar. Кажется, это работает, но я не уверен, что это лучший подход.

В идеале я бы хотел, чтобы в обоих случаях все работало гладко:

  • REPL против часовой стрелки
  • Стандартный процесс сборки Maven, который приводит к полностью упакованному / развернутому файлу jar

Каковы наилучшие практики для настройки базы кода Clojure, чтобы ее можно было легко использовать как в REPL, так и при создании автономного приложения?

1 Ответ

3 голосов
/ 19 февраля 2012

Единственное, что может помешать работе REPL, - это оператор с побочными эффектами верхнего уровня, который не должен запускаться, когда пространство имен требуется в REPL, и все же происходит в пространстве имен, которое может потребоваться (возможно, косвенно).требуется при REPL.Понятно, что это просто плохая идея (если она кажется в некотором роде полезной договоренностью - например, со сложными хуками для Leiningen) - пространство имен, вероятно, следует разделить на пространство имен, содержащее определения, и пространство имен скод побочного эффекта).

Естественный режим запуска приложения будет зависеть от того, к какому из следующих классов оно относится:

  1. основная точка входа в Clojure
    1. не возражайте против компиляции AOT кода Clojure
    2. предпочитайте избегать AOT
  2. главная точка входа в 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 в запуске.

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