Как интегрировать веб-приложения Clojure в Apache

Примечание

Учитывая, что этот OP был написан около двух лет назад, вместо того, чтобы снова задавать тот же вопрос, мне интересно, существуют ли пошаговые инструкции, чтобы я мог интегрировать нуар или другое веб-приложение Clojure в Apache, будь то Jetty, Tomcat или что-то еще. Подобные инструкции существуют для Django, и я думаю, что понимаю, что Python запускается в случае Django как движок, а не кольцевая структура, поэтому с веб-приложениями Clojure все сложнее.

Конец примечания

Я очень люблю Clojure, и Compojure кажется изящным веб-фреймворком.

Но все развалилось, когда я захотел развернуть свое приложение на обычном сервере приложений, таком как Tomcat, в качестве WAR. На самом деле мне пришлось написать собственные обработчики Ring для статических файлов и ресурсов, которые будут работать как на локальной Jetty, так и на Tomcat, потому что стандартные обработчики этого не сделали, и мне пришлось добавлять корень контекста везде вручную.

Я глубоко поражен тем, что мне пришлось написать весь этот код, чтобы создать простейшее из возможных веб-приложений, которое могло бы работать как на Jetty, так и на Tomcat. У меня есть только три возможных объяснения этому:

  1. Никто не использует Clojure / Compojure для чего-либо, кроме локальной разработки с помощью Jetty, то есть в продакшене.
  2. Все развертывают приложения Clojure / Compojure на выделенной Jetty без корневого контекста (например, люди делают это с приложениями Node.js)
  3. Есть действительно простой способ обойти проблемы, с которыми я столкнулся, о которых не знал.

Что из этого, по вашему мнению, так? Или что-то еще?

Изменить:

Обратите внимание, что создание файла войны с Maven / Leiningen - это не проблема, а не то, что я имею в виду. Мне интересно, что мне нужно написать так много кода, чтобы Compojure работал с Tomcat, базовые вещи, такие как обслуживание статических файлов и понимание корневого контекста, которые должны работать из коробки.


person futlib    schedule 01.04.2011    source источник
comment
+1 Мне бы очень был интересен исход этого вопроса.   -  person Stone Mason    schedule 01.04.2011
comment
Шаблон проекта торт, прикрепленный к моему ответу, решает проблемы, связанные с обслуживанием приложения как с Jetty для разработки , так и Tomcat.   -  person mac    schedule 04.04.2011


Ответы (7)


Люди развертывают приложения Compojure в контейнерах сервлетов, отличных от Jetty.

Проверить:

Также посмотрите lein-war

person Don Jackson    schedule 01.04.2011
comment
См. Мой комментарий, чтобы стоять в ответ. - person futlib; 02.04.2011
comment
Извините за то, что был так невежественен, перепутал lein-ring с leiningen-war. lein-ring действительно потрясающий и делает все, что я хочу: lein ring server для запуска Jetty, lein ring uberwar для создания войны, которая работает в Tomcat без каких-либо изменений маршрута. Если бы у Maven было что-то подобное, я пока переехал в Лейнинген. - person futlib; 26.09.2011

Чтобы сделать это безболезненным, я использую комбинацию из следующего:

Cake (включая команду развертывания)

Шаблон Cake для веб-проектов, разработанный Лау Йенсеном.

Vagrant (инструмент управления Ruby VM (Virtualbox), использующий Chef или Puppet)

VPS (от Slicehost)

Ключевой частью является созданный Лау шаблон веб-разработки. Папка webdev должна быть помещена в ~/.cake/templates. Для создания на его основе нового проекта используйте:

cake new webdev *projectname*

Пожалуйста, обратите внимание, что шаблон включает в себя log4j и почту Java, которые могут / должны быть исключены, если они не нужны. Далее предполагается, что вы используете Enlive и Mustache, но изменить это на Compojure / Hiccup тривиально, если это ваш яд.

Шаблон заботится об обслуживании приложения с пристани в процессе разработки (вы просто eval server.clj) и работает как война при работе под Tomcat. Маршруты остаются идентичными, если они развернуты на сервере как ROOT.war под Tomcat. Все статические файлы должны находиться в каталоге ресурсов. Jetty будет обслуживать их оттуда (благодаря промежуточному программному обеспечению Ring file). В процессе производства они перемещаются в корень веб-приложения и обслуживаются оттуда Tomcat (об этом позаботится файл web.xml).

Папка devbox содержит файл Vagrantfile и кулинарные книги, необходимые для создания виртуальной машины Virtualbox с установленным Tomcat. Я использую торт для развертывания файла .war в директорию /home/vagrant (это контролируется определением контекста разработчика в project.clj). Файл .war имеет символическую ссылку на каталог веб-приложений Tomcat (/var/lib/tomcat6/webapps) как ROOT.war. Для получения дополнительной информации о том, как использовать Vagrant, посетите сайт Vagrant.

Эта gist показывает пример того, как адаптировать project.clj для использования команды развертывания cake deploy. В примере создаются два контекста @dev и @prod, которые можно развернуть с помощью:

cake deploy @dev / cake delpoy @prod

Я собрал шаблон Cake webdev и файлы Vagrant в этом zip.

person mac    schedule 01.04.2011
comment
webdev должен быть первым в цепочке рецептов, примерно так: github.com/klang/ рецепты тортов - person klang; 04.04.2011
comment
Спасибо - почему-то спрашивающий не согласен :-) - person mac; 14.04.2011

У меня был некоторый успех, используя leiningen-war для создания общего файла войны (при условии, что вы, конечно, используете leiningen) . Он позволяет вам указывать местоположения для статического HTML, местоположение web.xml и других ресурсов в вашем файле project.clj.

Для меня было несложно создать общий файл войны, который я смог развернуть в JBoss (запустив Tomcat в качестве контейнера сервлетов), но я думаю, вы должны быть хорошо знакомы с форматом web.xml. Мне удобнее создавать свой собственный web.xml, так что мне больше нравится этот подход.

Похоже, что человек, стоящий за leiningen-war, сейчас рекомендует lein-ring. Я начал смотреть на это, но до сих пор мне не удавалось так легко получить из него общий файл войны.

Я согласен, однако, что учет производственного развертывания здесь является слабым местом.

person stand    schedule 01.04.2011
comment
Создание файла war для меня не проблема, я использую Maven, и это не сложно. Но настройка моего приложения для работы с проблемами сервера приложений, такими как обслуживание статических файлов и корень контекста, требует слишком много работы. - person futlib; 02.04.2011

Я использую Noir, веб-фреймворк, созданный на основе Ring и Compojure.

Я создал проект, используя lein noir new my-proj. Затем я создал каталог my-proj/web и добавил следующие строки в

project.clj:    
    :compile-path "web/WEB-INF/classes"
    :library-path "web/WEB-INF/lib"
    :ring {:handler project.server/handler}

Я установил каталог my-proj/web в качестве корневого контекста во время разработки Tomcat.

Для обслуживания статических файлов я помещаю материалы в каталог my-proj/resources/public. Для доступа к файлам (чтения / записи) через код можно использовать :servlet-context из заголовка кольцевого запроса. С указанными выше настройками контекстный путь будет: (.getRealPath (ring-request-header :servlet-context) "/WEB-INF/classes/myfile.txt"). Myfile.txt находится под my-proj/resources.

person user954311    schedule 20.09.2011

Если вы выполняете развертывание в Google App Engine, вот отличный блог http://compojureongae.posterous.com/

Вы все равно можете получить несколько полезных советов, даже если вы не выполняете развертывание в GAE.

person Matthew Boston    schedule 01.04.2011
comment
В этом примере запускается собственная Jetty. Так это обычный случай? - person futlib; 01.04.2011

Я выпустил в производство (уже более 6 месяцев) приложение Compojure + Vaadin. Упаковка была сделана с использованием плагина lein-war, и я не столкнулся с какими-либо серьезными проблемами.

Приложение называется halo и содержится в файле halo.war, контекст - / halo, а на сервере tomcat также работает Hudson и другое приложение, созданное на заказ. Ваадин правильно разрешает все мои статические файлы, CSS, изображения ... Я в основном использовал это сообщение в блоге, чтобы написать немного клея, необходимого для этого.

С другой стороны, я также запускаю Noir на Heroku, и у меня не было никаких проблем с упаковкой и развертыванием, и это тоже в производстве.

Это не имеет прямого отношения к вашему вопросу о Compojure, но Clojure в производстве в веб-приложениях, да, определенно.

person Nicolas Modrzyk    schedule 04.08.2011

Если вы используете сервер на основе кольца (compojure, noir / lib-noir, luminus и т. Д.) И хотите развернуть его как uberjar, чтобы избежать

"Failed to load Main-Class manifest attribute from your-uberjar.jar"

просто создайте уберджар с lein ring uberjar. Обратите внимание на «кольцо», добавленное к lein uberjar. Предполагается, что вы используете плагин lein-ring.

person Greg B    schedule 08.04.2013