C'est tout à fait une vieille question, et il y a eu des changements récents qui font de ce beaucoup plus facile.
Il y a deux choses principales que vous souhaitez:
- Le contrôle devrait revenir à la RÉPLICATION de sorte que vous pouvez garder à interagir avec votre serveur. Ceci est accompli en ajoutant {:rejoindre? false} options lors du démarrage du serveur Jetty.
- Vous souhaitez récupérer automatiquement les changements dans certains espaces de noms lors de la modification des fichiers. Cela peut être fait avec l'Anneau du "wrap-reload" middleware.
Un jouet application devrait ressembler à ceci:
(ns demo.core
(:use webui.nav
[clojure.java.io]
[compojure core response]
[ring.adapter.jetty :only [run-jetty]]
[ring.util.response]
[ring.middleware file file-info stacktrace reload])
(:require [compojure.route :as route] view)
(:gen-class))
; Some stuff using Fleet omitted.
(defroutes main-routes
(GET "/" [] (view/layout {:body (index-page)})
(route/not-found (file "public/404.html"))
)
(defn app
[]
(-> main-routes
(wrap-reload '(demo.core view))
(wrap-file "public")
(wrap-file-info)
(wrap-stacktrace)))
(defn start-server
[]
(run-jetty (app) {:port 8080 :join? false}))
(defn -main [& args]
(start-server))
Le wrap-fonction reload décore votre application routes avec une fonction qui détecte les changements dans la liste des espaces de noms. Lors du traitement d'une demande, si ces espaces ont été modifié sur le disque, ils sont rechargés avant le traitement de la demande. (Ma "vue" de l'espace de noms est créé dynamiquement par la Flotte, de sorte que cette auto-recharge mes modèles chaque fois qu'elles changent, aussi.)
J'ai rajouté quelques morceaux de middleware que j'ai trouve toujours utile. enveloppez-les descripteurs de fichiers statiques actifs. enveloppez-fichier-info définit le type MIME sur ceux statique actifs. enveloppez-stacktrace aide au débogage.
À partir de la REPL, vous pouvez lancer cette application en utilisant l'espace de noms et d'appel start-serveur directement. L' :gen-classe de mot-clé et la fonction principale signifie que l'application peut également être emballés comme un uberjar pour le démarrage de l'extérieur de la REPL, trop. (Il y a un monde en dehors de la REPL? Eh bien, certaines personnes ont demandé pour elle de toute façon...)