我想创建一个可以用tomcat部署的战争。使用lein uberwar
完成了这项工作就好了,但是在启动时做同样的事情似乎没有用。我可以建立一个罐子并运行它,但战争失败了
2015年12月9日上午12:15:31 org.apache.catalina.loader.WebappClassLoader validateJarFile INFO: validateJarFile(/var/lib/tomcat7/sites/geeknow.guru/DEBUG##0.1.7/WEB-INF/lib/javax.servlet-api-3.1.0.jar) - jar没装。请参见Servlet规范3.0,第10.7.2节。违规类:javax / servlet / 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 :(得分:2)
Tomcat抱怨说,因为你的war文件中包含的一个jar包含一个只有容器环境才能提供的类。战争中的违规行为是WEB-INF/lib/javax.servlet-api-3.1.0.jar
。
默认情况下,uber
任务会在WEB-INF/lib
设置为true时将所有依赖项(直接和传递)添加到--as-jars
的战争中。 --as-jars
是将部署依赖关系捆绑到servlet容器的首选方法。
问题似乎是你的一个直接依赖项引入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
,我们已将其排除在我们的超级战争之外。
"test"
范围对于您可能在测试中使用的依赖项(当然!)或部署,或者您需要依赖但不想分发它的其他任务也很有用。与您的工件,无论是图书馆jar还是超级战争网络应用程序。