2015-12-06 3 views
0

Я хочу создать войну, которую я смогу развернуть с помощью tomcat. С помощью lein uberwar эта работа была прекрасной, однако, как и при загрузке, работа не работает. Я могу построить баночку и запустить его, но война не может сСоздайте войну с boot-clj

дек 09, 2015 12:15:31 AM org.apache.catalina.loader.WebappClassLoader validateJarFile INFO: validateJarFile (/ вар/Библиотека/tomcat7/sites/geeknow.guru/DEBUG ## 0.1.7/WEB-INF/lib/javax.servlet-api-3.1.0.jar) - jar не загружен. См. Servlet Spec 3.0, раздел 10.7.2. Класс Оскорблять: javax/сервлет/Servlet.class

Я использую следующий build.boot

(set-env! 
:source-paths #{"src/clj"} 
:resource-paths #{"resources" "src/clj"} 
:dependencies '[[org.clojure/clojure "1.7.0"] 
       [clj-time "0.9.0"] 
       [org.clojure/java.jdbc "0.3.7"] 
       [org.postgresql/postgresql "9.4-1202-jdbc41"] 
       [yesql "0.5.1"] 
       [migratus "0.8.6"] 
       [markdown-clj "0.9.67"] 
       [jarohen/nomad "0.7.2"] 
       [com.draines/postal "1.11.3"] 
       [compojure "1.4.0"] 
       [ring/ring-core "1.4.0"] 
       [ring/ring-devel "1.4.0"] 
       [ring/ring-defaults "0.1.5"] 
       [ring/ring-jetty-adapter "1.4.0"] 
       [ring-refresh "0.1.1"] 
       [ring-logger-timbre "0.7.5"] 
       [com.taoensso/timbre "4.1.4"] 
       [hiccup "1.0.5"] 
       [garden "1.3.0"] 
       [danlentz/clj-uuid "0.1.6"] 
       [speclj "3.3.1" :scope "test"] 
       [pandeiro/boot-http "0.7.1-SNAPSHOT"]]) 

(require '[pandeiro.boot-http :as http]) 
(require '[ring.middleware.reload :refer [wrap-reload]]) 
(require '[ring.adapter.jetty :as jetty]) 
(require '[ring.middleware.refresh :refer [wrap-refresh]]) 
(require '[blog.handler]) 

;;;;taken from boot-http.util 
(defn resolve-sym [sym] 
    (require (symbol (namespace sym)) :reload) 
    (resolve sym)) 

(deftask ring-server 
    [] 
    (comp (jetty/run-jetty (wrap-refresh (wrap-reload (resolve-sym 'blog.handler/app))) {:port 3000}) (wait))) 

(deftask uberwar 
    [] 
    (comp (aot) (pom) (web) (uber) (war))) 

(deftask uberjar 
    [] 
    (comp (aot) (pom) (uber) (jar))) 

(task-options! 
pom {:project 'geeknow 
     :version "0.1.7"} 
;uber {:as-jars true} 
aot {:all true} 
jar {:main 'blog.core 
     :manifest {"Description" "blog"}} 
web {:serve 'blog.handler/app} 
war {:main 'blog.core 
     :manifest {"Description" "blog"}} 
repl {:init-ns 'blog.core}) 
+0

Вы строите с помощью jdk <8 и одна библиотека построена с использованием jdk8 – cfrick

+0

Я знаю. Именно поэтому я и сам пытался создать сервлет-адаптер-сервлет, но это не помогло. Я использовал следующую команду для ее сборки и установки, если это помогает 'boot -s src -d tailrecursion/clojure-adapter-servlet: 0.2.1 - pom -p clojure-adapter-servlet -v 0.2.1 - jar - - install' – Held

+0

Я обновил Java на сервере. Теперь я получаю новую ошибку. Я обновил вопрос соответственно – Held

ответ

2

Tomcat жалуется, потому что один из кувшинов, включенных в вашей войне файл содержит класс, который только может обеспечить контейнерная среда. Оскорбительная банка на войне - WEB-INF/lib/javax.servlet-api-3.1.0.jar.

По умолчанию задача uber добавляет все зависимости, прямые и транзитивные, к войне на WEB-INF/lib, когда значение --as-jars равно true. --as-jars - предпочтительный способ связывания зависимостей для развертывания в контейнерах сервлетов.

Проблема заключается в том, что одна из ваших прямых зависимостей вносит javax.servlet-api, а uber - это упаковка, вызывающая проблему Tomcat.

Сначала нам нужно выяснить, какая зависимость приводит к javax.servlet-api. boot show содержит множество опций для диагностики проблем с зависимостями, подобных этому. Вы можете узнать о них все с boot show -h. Тот, который мы хотим сейчас, - boot show -d, который печатает дерево зависимостей.

Вот фрагмент соответствующего выхода:

[ring/ring-jetty-adapter "1.4.0"] 
├── [org.eclipse.jetty/jetty-server "9.2.10.v20150310"] 
│ ├── [javax.servlet/javax.servlet-api "3.1.0"] 
│ ├── [org.eclipse.jetty/jetty-http "9.2.10.v20150310"] 
│ │ └── [org.eclipse.jetty/jetty-util "9.2.10.v20150310"] 
│ └── [org.eclipse.jetty/jetty-io "9.2.10.v20150310"] 
└── [ring/ring-servlet "1.4.0"] 

Из этого вывода, мы знаем, что наша зависимость от ring/ring-jetty-adapter является то, что вызывает javax.servlet/javax.servlet-api быть приведены в

Поскольку эта зависимость необходима для местных. мы не хотим полностью его опускать. Вместо этого, мы можем добавить зависимость с "test" сферы:

[ring/ring-jetty-adapter "1.4.0" :scope "test"] 

прицелы в Maven concept для ограничения транзитивность зависимостей в таких сценариях, как эти. Boot использует Maven для своего базового механизма разрешения зависимостей. uber чувствителен к областям Maven и может быть настроен на включение или исключение различных областей в зависимости от ваших потребностей. См. boot uber -h для получения дополнительной информации.

По умолчанию задача uber не будет связывать зависимости в области "test". Пометив ring/ring-jetty-adapter таким образом, мы исключили его из нашей uber войны.

Область применения "test" также полезна для зависимостей, которые вы можете использовать в тестах (конечно!), Или для развертывания, или для других задач, в течение которых вам нужна зависимость, но не хотите распространять ее с вашим артефактом, независимо от того, это библиотечная банка или веб-приложение uberwar.

+0

Спасибо за подробный ответ. Это действительно помогло мне понять проблему. К сожалению, 'ring-defaults' также включает' javax.servlet/servlet-api'. Я думаю, что нужно 'ring-defaults' для' ring.middleware.defaults', которое я использую в своем проекте. У вас есть идея, как это решить? – Held

+0

@Held вы можете исключить 'servlet-api' из' ring-defaults' с '[ring/default-defaults" 0.1.5 ": исключения [javax.servlet/servlet-api]]'. Затем, отдельно, введите 'servlet-api' * только в разработке * с помощью' [javax.servlet/servlet-api "2.5": scope "test"] '. –

+0

Не обращайте внимания на то, что я сказал о том, чтобы снова включить сервлет-api, он уже предоставляется локально адаптером для звонка. –