Tengo una aplicación de Java existente que se ejecuta en Tomcat a la que estoy agregando algún soporte Clojure primitivo. Por el momento, solo incluyo los archivos fuente de Clojure como recursos en el classpath y lo invoco a través del clojure.lang.RT
. Es primitivo, pero funciona bien.Recarga del código de Clojure en Tomcat
Sin embargo, me he dado cuenta de que Tomcat's WebappClassLoader
almacena en caché los recursos recuperados a través de getResourceAsInputStream()
que Clojure usa para recuperar y compilar el código fuente. Es decir, al hacer (require 'my-ns :reload)
, simplemente vuelve a cargar la versión almacenada en caché del archivo, aunque hay uno actualizado disponible en el disco. ¿Hay alguna forma de eludir o evitar este almacenamiento en caché de los archivos de Clojure?
Lo mejor que he encontrado después de mucho infructuoso Google es utilizar la reflexión para eliminar manualmente la entrada de WebappClassLoader.resourceEntries
que es horrible.
Me falta algo.
Respuestas como "use Jetty/Glassfish/JBoss", "reiniciar Tomcat", etc. no son lo que estoy buscando.
Gracias Chas. Tendré que pensar un poco sobre esto. Poner cosas en 'lib' no es tan conveniente. Me pregunto si '* use-context-classloader *' tendría un efecto sin atornillar otras cosas. –
@DaveRay '* use-context-classloader *' es verdadero por defecto. Si se establece en falso, las cargas se enrutarán a través del ClassLoader que cargó Clojure, lo que no tendrá ningún efecto (si Clojure se cargó desde la aplicación web) o causará la rotura (es decir, si coloca clojure.jar en '$ CATALINA_HOME/lib 'pero intente cargar el código de una aplicación web). P: ¿por qué no acaba de iniciar un servidor REPL desde la aplicación web, conectarse a él y cargar el código con abandono de esa manera? – cemerick
Gracias. Tal vez no soy lo suficientemente creativo sobre cómo usaría un servidor REPL para esto :) Digamos que tengo un montón de código en varios archivos en el disco.Arranco Tomcat con el servidor de réplica en ejecución, ¿cómo consigo todo ese código allí? –