我正在构建一个由两个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。为什么?
答案 0 :(得分:1)
您没有说明如何将这些和运行结合起来,所以我不知道您的类路径是如何设置的。但是,在两个上下文中都有相同的路由/资源配置,因此它们都会从类路径中的“public”中提取内容。如果firstproject / resources和secondproject / resources都在类路径上,那么您将发生冲突。在这种情况下,似乎首先看到第二个项目/资源,所以这就是被拉动的东西。
也许你应该将第一和第二个应用程序的“公共”分别改为“公共优先”和“公共优先”。然后,您可以为每个上下文使用适当的资源位置,而无需担心类路径。例如:
(route/resources "/" {:root "public-first"})
(route/resources "/" {:root "public-second"})