2012-02-19 3 views
2

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

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

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

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

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

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

ответ

3

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

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

  1. основной точкой входа в Clojure
    1. не против AOT компиляции Clojure кода
    2. предпочитаю избегать АОТА
  2. главной точки входа в Java (с Clojure материалом под названием через clojure.lang.RT)

Для 1.1. естественным подходом было бы использовать пространство имен 'd как Main-Class в банке приложения manifest.mf. Затем вы можете использовать java -jar (если это ubberjar/автономная банка)/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.

+0

спасибо Michal - очень полезно и интересно посмотреть перечисление всех жизнеспособных вариантов! – mikera

+0

Не беспокойтесь. Поздравляем с значком [clojure]! :-) –

+0

Спасибо .... хотя не уверен, что я этого заслужил, все еще кажется, что очень много учиться !! – mikera

Смежные вопросы