Jak zintegrować aplikacje internetowe Clojure w Apache

Uwaga

biorąc pod uwagę, że ten OP został napisany około dwa lata temu, zamiast zadawać to samo pytanie ponownie, zastanawiam się, czy istnieją instrukcje krok po kroku, dzięki czemu mogę zintegrować Noir lub inną aplikację internetową Clojure do Apache, czy to Jetty, Tomcat, czy coś innego. Podobne instrukcje istnieją dla Django i myślę, że rozumiem, że Python jest uruchamiany w przypadku Django jako silnik, a nie framework pierścieniowy, więc sprawy są bardziej skomplikowane z Clojure aplikacje internetowe.

Uwaga Końcowa

Jestem głęboko zakochany w Clojure, a Compojure wydaje się być porządnym frameworkiem internetowym.

Ale wszystko się rozpadło, gdy chciałem wdrożyć moją aplikację na zwykłym serwerze aplikacji, takim jak Tomcat jako wojnę. W rzeczywistości musiałem napisać niestandardowe programy obsługi pierścieni dla plików statycznych i zasobów, które działały zarówno na lokalnym Jetty, jak i Tomcacie, ponieważ programy obsługi Zapasów nie działały, i musiałem wszędzie prepend the context root ręcznie.

Jestem negatywnie zaskoczony, że musiałem napisać cały ten kod, aby stworzyć najprostszą aplikację internetową, jaka mogłaby działać zarówno na Jetty, jak i Tomcat. Mam na to tylko trzy możliwe wyjaśnienia:

    Nikt nie używa Clojure/Compojure do niczego innego niż rozwój lokalny z Jetty, tj. w produkcji]}
  1. każdy wdraża aplikacje Clojure / Compojure na dedykowanym Jetty bez roota kontekstowego (tak jak ludzie robią to z Node.js apps)
  2. istnieje bardzo prosty sposób na obejście problemów, na które wpadłem, nie byłem świadomy

Który z nich jest Twoim zdaniem przypadkiem? A może to coś innego?

Edit:

Zwróć uwagę, że tworzenie pliku wojennego jest nie do pomyślenia z Maven/Leiningen i nie o to mi chodzi. Zastanawiam się, że muszę napisać tyle kodu, aby Compojure działał z Tomcatem, podstawowe rzeczy, takie jak statyczne serwowanie plików i świadomość głównego kontekstu, że powinno działać po wyjęciu z pudełka.

Author: octopusgrabbus, 2011-04-01

7 answers

Ludzie wdrażają Aplikacje Compojure do niestandardowych kontenerów serwletów.

Zobacz:

Zobacz też: lein-war

 9
Author: Don Jackson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-04-01 15:36:49

Używam kombinacji następujących, aby uczynić to dość bezbolesne:

Cake (incl. polecenie deploy)

Szablon Cake dla webprojects opracowany przez Lau Jensena.

Vagrant (Ruby VM (Virtualbox) narzędzie do zarządzania, które opiera się na Chef lub Puppet)

VPS (z Slicehost)

Kluczową częścią jest szablon webdev wykonany przez Lau. Folder webdev powinien być umieszczony w ~/.cake/templates. Aby utworzyć nowy projekt na jego podstawie użycie:

cake new webdev *projectname*

Pls zauważ, że szablon zawiera log4j i Java mail, które mogą / powinny być wyłączone, jeśli nie są potrzebne. Dalej zakłada się, że używasz Enlive i Moustache, ale zmiana tego na Compojure / czkawka jest trywialna, jeśli to jest twoja trucizna.

Szablon zajmuje się obsługą aplikacji z jetty w rozwoju (wystarczy eval serwera.clj) i działa jako wojna, gdy działa pod Tomcat. Trasy pozostają identyczne, jeśli są wdrożone na serwerze jako ROOT.wojna pod Tomcat. Wszystkie pliki statyczne powinien znajdować się w katalogu zasobów. Jetty będzie je stamtąd obsługiwał (dzięki oprogramowaniu Pośredniczącemu do plików pierścieniowych). W produkcji są one przenoszone do katalogu głównego webapp i obsługiwane stamtąd przez Tomcat (web.xml dba o to).

Folder devbox zawiera plik Vagrantfile i książki kucharskie niezbędne do utworzenia wirtualnej maszyny wirtualnej Virtualbox z zainstalowanym Tomcat. Używam ciasta do rozmieszczania .plik war do katalogu /home/vagrant (jest to kontrolowane z definicji kontekstu dev w projekcie.clj). The .plik war jest dowiązany symbolicznie do katalogu Webapps Tomcat (/var/lib/tomcat6/webapps) jako ROOT.wojna. Aby uzyskać więcej informacji na temat korzystania z Vagrant, zobacz stronę Vagrant .

Ten gist pokazuje przykład jak dostosować projekt.clj, aby użyć polecenia Cake deploy. Przykład tworzy dwa konteksty @dev i @prod, które można wdrożyć za pomocą:

cake deploy @dev / cake delpoy @prod

Zebrałem szablon Cake webdev i pliki Vagrant w tym zip .

 11
Author: mac,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-30 19:38:45

Odniosłem pewien sukces używając leiningen-war do wygenerowania ogólnego pliku wojny(zakładając oczywiście, że używasz leiningen). Pozwala na określenie lokalizacji statycznego html, lokalizacji sieci web.xml i inne zasoby w Twoim projekcie.plik clj.

Nie było mi zbyt trudno wyprodukować ogólny plik wojenny, który udało mi się wdrożyć do JBoss (z tomcatem jako kontenerem servlet), ale myślę, że trzeba być dość zaznajomionym z siecią.format xml. Jest mi wygodniej. z tworzeniem własnej strony internetowej.xml tak, że może wyjaśnić moje lubienie tego podejścia bardziej.

Wydaje się, że osoba stojąca za leiningen-war zaleca lein-ring Teraz. Zacząłem na to patrzeć, ale do tej pory nie byłem w stanie uzyskać z niego tak łatwo ogólnego pliku wojennego.

Zgadzam się jednak, że rozliczanie wdrażania produkcji jest tutaj słabością.

 6
Author: stand,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-04-01 16:01:09

Używam Noir , frameworka internetowego zbudowanego na bazie Ring i Compojure.

Stworzyłem projekt używając lein noir new my-proj. Następnie utworzyłem katalog my-proj/web i dodałem następujące wiersze do

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

Ustawiłem katalog my-proj/web jako root kontekstowy podczas programowania dla Tomcat.

Do serwowania plików statycznych umieszczam rzeczy w katalogu my-proj/resources/public. Do uzyskiwania dostępu (odczytu/zapisu) plików za pomocą kodu można użyć :servlet-context z nagłówka żądania pierścienia. Przy powyższych Ustawieniach ścieżka kontekstowa będzie: (.getRealPath (ring-request-header :servlet-context) "/WEB-INF/classes/myfile.txt"). Myfile.txt jest pod my-proj/resources.

 3
Author: user954311,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-11-05 11:05:19

Jeśli wdrażasz na Google App Engine, oto świetny blog http://compojureongae.posterous.com/

Możesz nadal uzyskać kilka przydatnych wskazówek, nawet jeśli nie wdrażasz GAE.

 2
Author: Matthew Boston,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-04-01 10:52:37

Wydałem w produkcji (od ponad 6 miesięcy) aplikację Compojure+Vaadin. Pakowanie zostało wykonane za pomocą wtyczki lein-war i nie napotkałem żadnych większych problemów.

Aplikacja nazywa się halo, zawarta w halo.war file, kontekstem jest / halo, a na serwerze tomcat działa również inna aplikacja na zamówienie. Vaadin poprawnie rozwiązuje wszystkie moje pliki statyczne, CSS, obrazy... Użyłem głównie tego posta na blogu do napisania małego kleju potrzebne do tego.

Z drugiej strony, prowadzę również Noirna Heroku i nie miałem żadnych problemów z pakowaniem i wdrażaniem, a to również jest w produkcji.

Nie jest to bezpośrednio związane z twoim pytaniem Compojure, ale Clojure w produkcji w aplikacjach internetowych, tak, zdecydowanie.

 2
Author: Nicolas Modrzyk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-08-04 05:36:08

Jeśli używasz serwera opartego na pierścieniach (compojure, noir/lib-noir, luminus, itp.jest to jeden z najbardziej popularnych uberjarów na świecie.]}

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

Po prostu utwórz uberjar za pomocą lein ring uberjar. Zwróć uwagę na dodatek "ring" do lein uberjar. Zakładając, że używasz wtyczki lein-ring.

 1
Author: Greg B,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-04-08 20:13:24