2

2 つの Clojure プロジェクトで構成される Compojure webapp を構築しています。最初のものはいくつかのデータを視覚化するための webapp で、2 つ目は最初のものを使用する必要があるより複雑なアプリケーションです。

2 番目のプロジェクトのrun-jettyを使用して、両方のアプリケーションを同時に実行できるようにしたいと考えています。これにより、2 番目の webapp が最初の webapp から URL を呼び出して視覚化を取得できるようになります。

Compojureのコンテキストマクロを使用しています。2 つ目のアプリのルートは次のとおりです。

(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 "/"))])

2 つの main.js ファイルがあります。firstproject/resources/public/js/app/main.jsに 1 つ 、secondproject /resources/public/js/app/main.js に 1 つ

URL localhost:8080/first/app/js/main.jsを参照すると、 2 番目のプロジェクトの main.js が取得されます。どうして?

4

1 に答える 1

1

これらをどのように組み合わせて実行しているかを言わなかったので、クラスパスがどのように設定されているかわかりません。ただし、両方のコンテキストで同じルート/リソース構成があるため、どちらもクラスパスの「パブリック」からコンテンツをプルします。firstproject/resources と secondproject/resources の両方がクラスパスにある場合、競合が発生します。この場合、secondproject/resources が最初に表示されるように見えるため、それがプルされます。

たぶん、最初と2番目のアプリの「パブリック」をそれぞれ「パブリックファースト」と「パブリックセカンド」に変更する必要があります。次に、クラスパスを気にせずに、各コンテキストに適切なリソースの場所を使用します。元:

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