Приложение Clojure + Compojure + Maven не работает в Tomcat

Я работаю над простым веб-приложением, написанным на Clojure, с использованием инфраструктуры веб-приложений Compojure и Maven.

Это упрощенная версия моего сервлета:

(ns core
  (:use compojure.core ring.util.servlet)
  (:require [compojure.route :as route])
  (:gen-class :extends javax.servlet.http.HttpServlet))

(defroutes main-routes
  (GET "/" _ {:status 302 :headers {"Location" "/about"}})
  (GET "/about" [] "This is the about page")
  (route/not-found "File not found."))

(defservice main-routes)

Это отлично работает с использованием цели Maven Jetty следующим образом:

mvn jetty:run

Однако, когда я создаю WAR из этого и развертываю его на Tomcat, я всегда вижу свою страницу 404, то есть «Файл не найден». Вы можете мне сказать, почему это происходит?

Я строю ВОЙНУ следующим образом:

mvn package

Я заметил предупреждение в Tomcat о дублировании servlet-api.jar, и Maven действительно помещает его в WEB-INF / lib. Я удалил servlet-api.jar из WAR и по-прежнему сталкиваюсь с той же проблемой, но означает ли это, что что-то не так со всем моим процессом упаковки WAR?

Может быть, это проблема с другим URL-адресом? Когда я запускаю локальную пристань, URL-адрес выглядит следующим образом:

http://localhost:8080/home

Но если я запускаю его на Tomcat, это будет примерно так:

http://localhost:8080/myapp/home

Может быть, «/ myapp» является частью маршрута? Как мне решить эту проблему?


person futlib    schedule 18.03.2011    source источник


Ответы (2)


Взгляните на следующий пример - он работает как в tomcat, так и на причале. Если вы используете mvn jetty: run, вам также необходимо указать префикс, который будет использоваться (вы можете увидеть это в pom.xml для военной цели)

person Alex Ott    schedule 18.03.2011
comment
Спасибо, разобрался благодаря вашему проекту. Хитрость заключается в том, чтобы 1. Установить контекстный путь для пристани, как вы объяснили, и 2. установить имя сгенерированной войны для myapp, чтобы это не было myapp-1.0.0-SNAPHOT. Есть идеи, почему для меня включен servlet-api.jar? - person futlib; 19.03.2011

Свободно цитируется из http://wiki.apache.org/tomcat/HowTo:

Если вы используете метод войны для развертывания приложения:

  • удалить ROOT-каталог
  • назовите свой военный файл ROOT.war (обязательно с заглавными буквами)
  • перетащите файл ROOT.war прямо в каталог / webapps. Tomcat автоматически развернет его.
person ponzao    schedule 18.03.2011
comment
Я не думаю, что это хорошая идея: это будет означать, что на сервере можно установить только одно приложение, подобное моему. - person futlib; 19.03.2011