Подтвердить что ты не робот

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

Примечание

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

Заключительная записка

Я глубоко влюблен в Clojure, а Compojure выглядит как аккуратная веб-фреймворк.

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

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

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

Какой из них, по вашему мнению, имеет дело? Или это что-то еще?

Edit:

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

4b9b3361

Ответ 2

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

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

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

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 Ring). В производстве они перемещаются в корень webapp и отправляются оттуда Tomcat (об этом заботится web.xml).

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

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

cake deploy @dev / cake delpoy @prod

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

Ответ 3

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

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

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

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

Ответ 4

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

Ответ 5

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

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

Ответ 6

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

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

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

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

Ответ 7

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

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

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