57 votes

Comment intégrer des applications Web Clojure dans Apache ?

Note

Étant donné que cet OP a été écrit il y a environ deux ans, plutôt que de poser à nouveau la même question, je me demande s'il existe des instructions étape par étape, afin que je puisse intégrer un Noir ou une autre application web Clojure dans Apache, que ce soit Jetty, Tomcat, ou autre. Des instructions similaires existent pour Django, et je pense avoir compris que Python est utilisé dans le cas de Django comme un moteur plutôt que comme un framework annulaire, les choses sont donc plus compliquées avec les applications web Clojure.

Note de fin

Je suis profondément amoureux de Clojure, et Compojure semble être un framework web soigné.

Mais tout s'est écroulé lorsque j'ai voulu déployer mon application sur un serveur d'application ordinaire comme Tomcat en tant que WAR. J'ai dû écrire des gestionnaires Ring personnalisés pour les fichiers statiques et les ressources qui fonctionneraient à la fois sur Jetty et sur Tomcat, car les gestionnaires standard ne fonctionnaient pas, et j'ai dû ajouter manuellement la racine contextuelle partout.

Je n'en reviens pas d'avoir dû écrire tout ce code pour créer l'application web la plus simple qui soit et qui fonctionne à la fois sur Jetty et Tomcat. Je n'ai que trois explications possibles pour cela :

  1. Personne n'utilise Clojure/Compojure pour autre chose que le développement local avec Jetty, c'est-à-dire en production.
  2. Tout le monde déploie des applications Clojure/Compojure sur un Jetty dédié sans contexte Root (comme les gens le font avec les applications Node.js).
  3. Il existe un moyen très simple de contourner les problèmes que j'ai rencontrés et dont je n'étais pas au courant.

Lequel de ces points est, à votre avis, le cas ? Ou s'agit-il d'autre chose ?

Editar:

Veuillez noter que la création d'un fichier war est un jeu d'enfant avec Maven/Leiningen et n'est pas ce que je veux dire. Je me demande si je dois écrire autant de code pour faire fonctionner Compojure avec Tomcat, des trucs de base comme le service de fichiers statiques et la conscience de la racine du contexte qui devrait travailler en dehors de la boîte.

11voto

mac Points 3089

J'utilise une combinaison des éléments suivants pour que cela soit relativement facile :

Gâteau (y compris la commande deploy)

Un modèle Cake pour les projets web développé par Lau Jensen.

Vagrant (outil de gestion de Ruby VM(Virtualbox), qui s'appuie sur Chef ou Puppet)

VPS (de Slicehost)

L'élément clé est le modèle de webdev que Lau a créé. Le dossier webdev doit être placé dans le dossier ~/.cake/templates . Pour créer un nouveau projet basé sur celui-ci, utilisez :

cake new webdev *projectname*

Veuillez noter que le modèle inclut log4j et Java mail qui peuvent/doivent être exclus s'ils ne sont pas nécessaires. Il suppose en outre que vous utilisez Enlive et Moustache, mais il est facile de changer cela en Compojure/Hiccup si c'est votre choix.

Le modèle se charge de servir l'application à partir de Jetty en développement (il suffit d'évaluer server.clj) et fonctionne comme un war lorsqu'il est exécuté sous Tomcat. Les routes restent identiques si elles sont déployées sur le serveur en tant que Root.war sous Tomcat. Tous les fichiers statiques doivent être situés dans le répertoire des ressources. Jetty les servira à partir de là (grâce à l'intergiciel Ring file). En production, ils sont déplacés vers la racine de la webapp et servis à partir de là par Tomcat (le web.xml s'en charge).

Le dossier devbox contient un fichier Vagrant et les cookbooks nécessaires pour créer une VM Virtualbox avec Tomcat installé. J'utilise cake pour déployer le fichier .war dans le dossier /home/vagrant (ceci est contrôlé à partir de la définition du contexte dev dans project.clj). Le fichier .war est lié par un lien symbolique au répertoire webapps de Tomcat ( /var/lib/tomcat6/webapps ) comme Root.war. Pour plus d'informations sur l'utilisation de Vagrant, veuillez consulter le site Web de Vagrant. site .

Ce site Gist montre un exemple d'adaptation du project.clj pour utiliser la commande cake deploy. L'exemple crée deux contextes, @dev et @prod, dans lesquels vous pouvez effectuer un déploiement à l'aide de la commande :

cake deploy @dev / cake delpoy @prod

J'ai rassemblé le modèle webdev de Cake et les fichiers de Vagrant dans ceci zip .

9voto

Don Jackson Points 106

Les gens déploient des applications Compojure dans des conteneurs de servlets non Jetty.

Vérifiez :

Consultez également le site lein-war

6voto

stand Points 1424

J'ai eu du succès en utilisant guerre de leiningen pour générer un fichier war générique (en supposant que vous utilisez leiningen, bien sûr). Il vous permet de spécifier les emplacements pour le html statique, l'emplacement d'un web.xml et d'autres ressources dans votre fichier project.clj.

Je n'ai pas eu trop de mal à produire un fichier war générique que j'ai pu déployer sur JBoss (en utilisant Tomcat comme conteneur de servlets) mais je pense qu'il faut être assez familier avec le format web.xml. Je suis plus à l'aise avec la création de mon propre web.xml, ce qui explique peut-être pourquoi je préfère cette approche.

Il semble que la personne derrière leiningen-war recommande lein-ring maintenant. J'ai commencé à m'y intéresser, mais jusqu'à présent, je n'ai pas réussi à en tirer un fichier de guerre générique aussi facilement.

Je reconnais cependant que la prise en compte du déploiement de la production est une faiblesse ici.

3voto

user954311 Points 31

J'utilise Noir un framework web construit au dessus de Ring et Compojure.

J'ai créé un projet en utilisant lein noir new my-proj . Puis j'ai créé my-proj/web et ajouté les lignes suivantes à

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

J'ai mis my-proj/web comme contexte Root pendant le développement pour Tomcat.

Pour le service de fichiers statiques, je mets les choses sous my-proj/resources/public répertoire. Pour accéder (lire/écrire) aux fichiers par le biais du code, :servlet-context de l'en-tête de la demande d'anneau peut être utilisé. Avec les paramètres ci-dessus, le chemin contextuel serait : (.getRealPath (ring-request-header :servlet-context) "/WEB-INF/classes/myfile.txt") . Monfichier.txt est sous my-proj/resources .

2voto

Matthew Boston Points 813

Si vous déployez sur Google App Engine, voici un excellent blog http://compojureongae.posterous.com/

Vous pouvez obtenir des conseils utiles même si vous ne déployez pas sur GAE.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X