2015-12-06 42 views
0

我想创建一个可以使用tomcat部署的战争。使用lein uberwar做得很好,但是在开机时做同样的事似乎没有效果。我可以建立一个罐子并运行它,但战争失败与boot-clj创建一场战争

2015年12月9日上午12时15分31秒org.apache.catalina.loader.WebappClassLoader validateJarFile信息: 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

你正在建设一个jdk <8和一个库,使用jdk8 – cfrick

+0

我知道。这就是为什么我自己尝试构建clojure-adapter-servlet的原因,但它没有帮助。如果这有助于'boot -s src -d tailrecursion/clojure-adaptor-servlet:0.2.1 -pom -p clojure-adapter-servlet -v 0.2.1 -jar - - 安装' – Held

+0

我在服务器上更新了Java。现在我得到一个新的错误。我相应地更新了这个问题 – Held

回答

2

Tomcat的抱怨,因为包含在war文件坛子里的一个包含一个类只有容器环境可以提供。战争中的犯规罐子是WEB-INF/lib/javax.servlet-api-3.1.0.jar

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

这个问题似乎是你的一个直接依赖引入了javax.servlet-apiuber正在打包它,导致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或uberwar网络应用程序。

+0

感谢您的详细回复。这真的帮助我了解这个问题。不幸的是,'ring-defaults'还引入了'javax.servlet/servlet-api'。我认为需要在我的项目中使用'ring.middleware.defaults'的'ring-defaults'。你有一个想法如何解决这个问题? – Held

+0

@你可以用'[ring/ring-defaults“0.1.5”:exclusions [javax.servlet/servlet-api]]''''''ring-defaults''来排除'servlet-api'。然后,分别在''javax.servlet/servlet-api“2.5”:scope“test”]中引入'servlet-api' *。 –

+0

无视我说过再次引入servlet-api的内容,它已经由环形码头适配器在本地提供。 –