56 Stimmen

Wie man Clojure-Webanwendungen in Apache integriert

Nota

Da diese OP vor etwa zwei Jahren geschrieben wurde, frage ich mich, ob es eine Schritt-für-Schritt-Anleitung gibt, mit der ich eine Noir- oder andere Clojure-Webanwendung in den Apache integrieren kann, egal ob es sich um Jetty, Tomcat oder etwas anderes handelt. Ähnliche Anleitungen gibt es für Django, und ich glaube zu wissen, dass Python im Fall von Django als Engine und nicht als Ring-Framework ausgeführt wird, so dass die Dinge bei Clojure-Webanwendungen komplizierter sind.

Ende Anmerkung

Ich bin sehr verliebt in Clojure, und Compojure scheint ein ordentliches Web-Framework zu sein.

Aber alles brach zusammen, als ich meine Anwendung auf einem normalen Anwendungsserver wie Tomcat als WAR bereitstellen wollte. Ich musste benutzerdefinierte Ring-Handler für statische Dateien und Ressourcen schreiben, die sowohl auf dem lokalen Jetty als auch auf Tomcat funktionierten, da die Standard-Handler dies nicht taten, und ich musste den Kontext Root überall manuell vorangestellt.

Ich bin negativ erstaunt, dass ich all diesen Code schreiben musste, um die denkbar einfachste Webanwendung zu erstellen, die sowohl auf Jetty als auch auf Tomcat laufen würde. Ich habe nur drei mögliche Erklärungen dafür:

  1. Niemand verwendet Clojure/Compojure für etwas anderes als die lokale Entwicklung mit Jetty, d.h. in der Produktion
  2. Jeder stellt Clojure/Compojure-Anwendungen auf einem dedizierten Jetty ohne Context Root bereit (so wie man es mit Node.js-Anwendungen macht)
  3. Es gibt eine wirklich einfache Möglichkeit, die Probleme zu umgehen, die mir nicht bewusst waren

Was davon ist Ihrer Meinung nach der Fall? Oder ist es etwas anderes?

Edit :

Bitte beachten Sie, dass das Erstellen einer War-Datei mit Maven/Leiningen ein Kinderspiel ist und nicht das, was ich meine. Ich wundere mich, dass ich so viel Code schreiben muss, damit Compojure mit Tomcat funktioniert, grundlegende Dinge wie statisches File Serving und Context Root Awareness, die debe aus der Box heraus arbeiten.

11voto

mac Punkte 9658

Ich verwende eine Kombination der folgenden Methoden, um dies relativ schmerzlos zu gestalten:

Torte (einschließlich des Befehls deploy)

Eine Cake-Vorlage für Webprojekte, entwickelt von Lau Jensen.

Vagrant (Ruby VM(Virtualbox)-Verwaltungstool, das sich auf Chef oder Puppet stützt)

VPS (von Slicehost)

Der wichtigste Teil ist die Webdev-Vorlage, die Lau erstellt hat. Der Ordner webdev sollte im Verzeichnis ~/.cake/templates . Um ein neues Projekt auf dieser Grundlage zu erstellen, verwenden Sie:

cake new webdev *projectname*

Bitte beachten Sie, dass die Vorlage log4j und Java Mail enthält, die Sie ausschließen können/sollten, wenn sie nicht benötigt werden. Es wird außerdem davon ausgegangen, dass Sie Enlive und Moustache verwenden, aber es ist trivial, das auf Compojure/Hiccup zu ändern, wenn das Ihr Gift ist.

Das Template kümmert sich um die Bereitstellung der App von Jetty in der Entwicklung (Sie müssen nur server.clj entwickeln) und arbeitet als War, wenn es unter Tomcat läuft. Die Routes bleiben identisch, wenn sie unter Tomcat als Root.war auf dem Server bereitgestellt werden. Alle statischen Dateien sollten sich im Ressourcen-Verzeichnis befinden. Jetty wird sie von dort aus bereitstellen (dank der Ring File Middleware). In der Produktion werden sie in das Root-Verzeichnis der Webapplikation verschoben und von dort aus von Tomcat bedient (die web.xml kümmert sich darum).

Der Ordner devbox enthält eine Vagrant-Datei und Kochbücher, die zur Erstellung einer Virtualbox-VM mit installiertem Tomcat erforderlich sind. Ich verwende Cake, um die .war-Datei auf dem /home/vagrant Verzeichnis (dies wird durch die Definition des Dev-Kontextes in project.clj gesteuert). Die .war-Datei wird über einen Symlink in das Tomcat-Webapps-Verzeichnis ( /var/lib/tomcat6/webapps ) als Root.war. Weitere Informationen zur Verwendung von Vagrant finden Sie in der Vagrant Website .

Este . zeigt ein Beispiel für die Anpassung der Datei project.clj zur Verwendung des Cake-Deploy-Befehls. Das Beispiel erstellt zwei Kontexte @dev und @prod, in die Sie mit deployen können:

cake deploy @dev / cake delpoy @prod

Ich habe die Cake webdev-Vorlage und die Vagrant-Dateien in diesem zip .

9voto

Don Jackson Punkte 106

Compojure-Anwendungen werden in Servlet-Containern eingesetzt, die nicht von Jetty stammen.

Sehen Sie sich das an:

Besuchen Sie auch lein-war

6voto

stand Punkte 2984

Ich hatte einigen Erfolg mit leiningen-krieg um eine generische War-Datei zu erzeugen (natürlich unter der Voraussetzung, dass Sie leiningen verwenden). Es ermöglicht Ihnen, Speicherorte für statisches HTML, den Speicherort einer web.xml und andere Ressourcen in Ihrer project.clj-Datei anzugeben.

Es war nicht allzu schwierig für mich, eine generische War-Datei zu erstellen, die ich in JBoss einsetzen konnte (mit Tomcat als Servlet-Container), aber ich denke, man muss mit dem web.xml-Format ziemlich vertraut sein. Ich bin mit der Erstellung meiner eigenen web.xml besser vertraut, daher gefällt mir dieser Ansatz vielleicht besser.

Es scheint, dass die Person, die hinter leiningen-war steht, Folgendes empfiehlt lein-ring jetzt. Ich habe angefangen, mir das anzusehen, aber bisher war ich nicht in der Lage, eine generische War-Datei so einfach zu bekommen.

Ich stimme allerdings zu, dass die Berücksichtigung des Produktionseinsatzes hier eine Schwachstelle ist.

3voto

user954311 Punkte 41

Ich verwende Noir , ein Web-Framework, das auf Ring und Compojure aufbaut.

Ich habe ein Projekt erstellt mit lein noir new my-proj . Dann habe ich my-proj/web Verzeichnis und fügte folgende Zeilen hinzu

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

Ich habe festgelegt my-proj/web Verzeichnis als Kontext Root während der Entwicklung für Tomcat.

Für die Bereitstellung statischer Dateien lege ich das Material unter my-proj/resources/public Verzeichnis. Für den Zugriff auf Dateien (Lesen/Schreiben) durch Code, :servlet-context aus dem Ring-Request-Header verwendet werden kann. Mit den obigen Einstellungen würde der kontextuelle Pfad lauten: (.getRealPath (ring-request-header :servlet-context) "/WEB-INF/classes/myfile.txt") . Myfile.txt ist unter my-proj/resources .

2voto

Matthew Boston Punkte 1320

Wenn Sie auf Google App Engine bereitstellen, finden Sie hier einen großartigen Blog http://compojureongae.posterous.com/

Vielleicht erhalten Sie einige nützliche Tipps, auch wenn Sie nicht mit GAE arbeiten.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X