5 votes

Rechargement du code Clojure dans Tomcat

J'ai une application web Java existante qui tourne dans Tomcat et à laquelle j'ajoute un support Clojure primitif. Pour l'instant, je me contente d'inclure les fichiers sources de Clojure en tant que ressources dans le classpath et de l'invoquer par le biais de la commande clojure.lang.RT . C'est primitif, mais ça fonctionne bien.

Cependant, j'ai remarqué que la fonction de Tomcat WebappClassLoader met en cache les ressources récupérées par getResourceAsInputStream() que Clojure utilise pour récupérer et compiler le code source. C'est-à-dire qu'en faisant (require 'my-ns :reload) recharge simplement la version en cache du fichier, même si une version mise à jour est disponible sur le disque. Existe-t-il un moyen de contourner ou d'éviter cette mise en cache pour les fichiers Clojure ?

La meilleure solution que j'ai trouvée après de nombreuses recherches infructueuses sur Internet est d'utiliser la méthode de réflexion pour supprimer manuellement l'entrée dans le fichier WebappClassLoader.resourceEntries qui est affreux .

Je dois manquer quelque chose.

Les réponses du type "utiliser Jetty/Glassfish/JBoss", "redémarrer Tomcat", etc. ne sont pas ce que je recherche.

2voto

cemerick Points 3279

Vous ne serez pas en mesure de contourner WebappClassLoader Le comportement de l'entreprise. Ce que vous puede est de déplacer le code qui est chargé en dehors de sa juridiction ; par exemple jusqu'à $CATALINA_HOME/lib comme décrit aquí .

Vous devrez également y déplacer toutes vos dépendances, en laissant le fichier .war que vous déployez réellement en tant que webapp comme un petit shell qui s'attend à ce que tout le code soit déjà disponible ailleurs.

Cela vous permettra de sortir de WebappClassLoader et, espérons-le, sa sémantique également. (S'il met en cache les choses chargées depuis les classloaders parents, cela semblerait complètement cassé IMO).

0voto

Shantanu Kumar Points 558

Pouvez-vous placer les fichiers sources de Clojure sous WEB-INF ? Vous pouvez alors les lire en utilisant http://tomcat.apache.org/tomcat-5.5-doc/servletapi/javax/servlet/ServletContext.html#getResourceAsStream(java.lang.String

servletContext.getResourceAsStream("/WEB-INF/foo/core.clj");

Cela a fonctionné pour moi dans le passé pour charger des classes Groovy non mises en cache depuis la source dans Tomcat.

0voto

kotarak Points 11177

Est-ce que cela est lié à la cachingAllowed drapeau comme décrit aquí ? Je tire dans le bleu.

0voto

kotarak Points 11177

Ou utilisez une version corrigée de clojure qui fait quelque chose de ce genre :

(io/input-stream (io/resource "bla.clj"))

J'ai trouvé une remarque sur le net selon laquelle cela n'est pas mis en cache.

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