Как интегрировать веб-приложения Clojure в Apache - PullRequest
57 голосов
/ 01 апреля 2011

Примечание

Учитывая, что этот OP был написан около двух лет назад, а не задавать тот же вопрос снова, мне интересно, существуют ли пошаговые инструкции, чтобы я мог интегрировать Noir или другое веб-приложение 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. Существует очень простой способ обойти проблемы, с которыми я столкнулся, о которых я не знал

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

Edit:

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

Ответы [ 7 ]

11 голосов
/ 01 апреля 2011

Я использую следующие комбинации, чтобы сделать это довольно безболезненно:

Cake (включая команду deploy)

Шаблон Cake для веб-проектов, разработанный LauJensen.

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

VPS (от Slicehost)

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

cake new webdev *projectname*

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

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

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

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

cake deploy @dev / cake delpoy @prod

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

9 голосов
/ 01 апреля 2011

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

Выезд:

Также проверьте lein-war

6 голосов
/ 01 апреля 2011

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

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

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

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

3 голосов
/ 20 сентября 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.

2 голосов
/ 04 августа 2011

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

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

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

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

2 голосов
/ 01 апреля 2011

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

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

1 голос
/ 09 апреля 2013

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

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

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

...