2012-02-22 2 views
2

Я строю Compojure webapp, состоящий из двух проектов Clojure. Первый - webapp для визуализации некоторых данных, второй - более сложное приложение, которое должно использовать первое.Настройка контекстного пути для маршрутов в Compojure

Я хочу иметь возможность запускать оба приложения одновременно с 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/ресурсов/общественных/JS/приложение/main.js и один в secondproject/ресурсов/общественных/JS/приложение/main.js

Когда я просматриваю URL локальный: 8080/first/app/js/main.js Я получаю main.js второй проект. Почему так?

ответ

1

Вы не сказали, как вы их объединяете и бегаете, поэтому я не знаю, как настроен ваш класс. Тем не менее, у вас есть одна и та же конфигурация маршрутов/ресурсов в обоих контекстах, поэтому они оба будут вытаскивать контент из «public» в ваш путь к классам. Если оба метода firstproject/resources и secondproject/resources находятся в пути к классам, у вас возникнут конфликты. В этом случае, кажется, второй проект/ресурсы видны первыми, так вот что получается.

Возможно, вам следует изменить «общедоступный» для первого и второго приложений как «общедоступный» и «общедоступный», соответственно. Затем вы используете соответствующее расположение ресурсов для каждого контекста, не беспокоясь о пути к классам. Пример:

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