it-roy-ru.com

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

Примечание

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

57
futlib

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

Проверять, выписываться:

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

9
Don Jackson

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

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

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

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

VPS (от Slicehost)

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

cake new webdev *projectname*

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

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

Папка devbox содержит Vagrantfile и кулинарные книги, необходимые для создания Virtualbox VM с установленным Tomcat. Я использую торт для развертывания .war-файла в директории /home/vagrant (это контролируется из определения контекста dev в 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 .

11
mac

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

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

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

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

6
stand

Я использую 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.

3
user954311

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

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

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

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

2
Nicolas Modrzyk

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

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

2
Matthew Boston

Если вы используете кольцевой сервер (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.

1
Greg B