在Compojure中设置路由的上下文路径

时间:2012-02-22 17:06:55

标签: clojure compojure ring

我正在构建一个由两个Clojure项目组成的Compojure webapp。第一个是用于可视化某些数据的webapp,第二个是需要使用第一个的更复杂的应用程序。

我希望能够在第二个项目中使用 run-jetty 同时运行这两个应用程序。这将允许第二个webapp从第一个调用URL来获取可视化。

我正在使用Compojure中的上下文宏,以下是第二个应用的路由:

(def second-project-main-routes
  [
   (context "/second" request
            (GET "/viewsession" {session :session} (str session))
            (GET "/resetsession" [] (reset-session))
             ... other routes here ...
            (route/resources "/"))
  ])


(def second-all-routes
(concat second-project-main-routes
         first-project-routes)


(def second-app
  (-> (handler/site (apply routes second-all-routes))
      (wrap-base-url)))

;; to comment when building the JAR:
(defonce second-server (run-jetty #'second-app {:join? false :port 8080}))

这里是第一个应用的路线:

(def first-project-routes
[(context "/first" request
        (GET "/" [] (index-page))
        (route/files "/" {:root (str (System/getProperty "user.dir") "/data/public")})
        (route/resources "/"))])

我有两个main.js文件。一个在 firstproject / resources / public / js / app / main.js 和一个 in secondproject / resources / public / js / app / main.js

当我浏览网址 localhost:8080 / first / app / js / main.js 时,我会获得第二个项目的main.js。为什么?

1 个答案:

答案 0 :(得分:1)

您没有说明如何将这些和运行结合起来,所以我不知道您的类路径是如何设置的。但是,在两个上下文中都有相同的路由/资源配置,因此它们都会从类路径中的“public”中提取内容。如果firstproject / resources和secondproject / resources都在类路径上,那么您将发生冲突。在这种情况下,似乎首先看到第二个项目/资源,所以这就是被拉动的东西。

也许你应该将第一和第二个应用程序的“公共”分别改为“公共优先”和“公共优先”。然后,您可以为每个上下文使用适当的资源位置,而无需担心类路径。例如:

(route/resources "/" {:root "public-first"})
(route/resources "/" {:root "public-second"})