2

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

我希望能够使用第二个项目中的run-jetty同时运行这两个应用程序。这将允许第二个 webapp 从第一个 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和一个 在 secondproject/resources/public/js/app/main.js

当我浏览 url localhost:8080/first/app/js/main.js 时,我得到了第二个项目的 main.js。为什么?

4

1 回答 1

1

你没有说你是如何组合这些和运行的,所以我不知道你的类路径是如何设置的。但是,您在两个上下文中具有相同的路由/资源配置,因此它们都会从您的类路径上的“公共”中提取内容。如果 firstproject/resources 和 secondproject/resources 都在类路径上,那么您将遇到冲突。在这种情况下,似乎首先看到的是 secondproject/resources,所以这就是被拉取的。

也许您应该将第一个和第二个应用程序上的“public”分别更改为“public-first”和“public-second”。然后,您对每个上下文使用适当的资源位置,而不必担心类路径。前任:

(route/resources "/" {:root "public-first"})
(route/resources "/" {:root "public-second"})
于 2014-02-24T16:10:17.100 回答