首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用boot-clj创建一个war

使用boot-clj创建一个war
EN

Stack Overflow用户
提问于 2015-12-06 17:42:14
回答 1查看 790关注 0票数 0

我想制造一场我可以用tomcat部署的战争。使用lein uberwar可以很好地完成任务,但是对引导做同样的工作似乎不起作用。我可以建一个罐子并运行它,但是战争失败了

2015年12月9日12:15:31 AM org.apache.catalina.loader.WebappClassLoader validateJarFile信息:org.apache.catalina.loader.WebappClassLoader- jar未加载。参见ServletSpec3.0,第10.7.2节。违规类: javax/servlet/Servlet.class

我正在使用以下build.boot

代码语言:javascript
复制
(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})
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-12-17 02:21:25

Tomcat正在抱怨,因为war文件中包含的一个war包含了一个只有容器环境才能提供的类。战争中令人反感的罐子是WEB-INF/lib/javax.servlet-api-3.1.0.jar

默认情况下,当uber设置为true时,WEB-INF/lib任务将直接和传递的所有依赖项添加到war中。--as-jars是捆绑依赖关系以部署到servlet容器的首选方法。

问题似乎是,您的直接依赖项之一是引入了javax.servlet-api,而uber正在打包它,从而导致Tomcat问题。

首先,我们需要找出引入javax.servlet-api的依赖项。boot show包含许多用于诊断像这样的依赖问题的选项。您可以通过boot show -h了解所有这些信息。我们现在想要的是boot show -d,它打印依赖树。

以下是相关输出的片段:

代码语言:javascript
复制
[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"作用域的依赖项:

代码语言:javascript
复制
[ring/ring-jetty-adapter "1.4.0" :scope "test"]

作用域是一个Maven概念,用于限制此类场景中依赖项的传递性。引导使用Maven作为其底层依赖解决机制。uber对Maven作用域很敏感,可以根据需要配置为包含或排除各种作用域。有关详细信息,请参阅boot uber -h

默认情况下,uber任务不会在"test"作用域中打包依赖项。通过这样标记ring/ring-jetty-adapter,我们已经将它排除在我们的超级战争之外。

"test"作用域对于您可能在测试中使用的依赖项(当然!),或者对于部署,或者对于其他您需要依赖但不想与您的工件一起分发的任务,无论是库jar还是uberwar web应用程序,都是有用的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34120541

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档