![](/img/trans.png)
[英]Clojure: NoClassDefFoundError with lein ring uberwar but not when I Compile with the REPL
[英]What Is The Reason For The Lein Cyclic Dependency Error When I build uberwar?
構建環服務器 - 無頭工程 - lein ring server-headless
- 但是當我嘗試構建戰爭或uberwar時,我得到以下錯誤,並且無法弄清楚為什么會發生這種情況。
No namespaces to :aot compile listed in project.clj.
Exception in thread "main" java.lang.ExceptionInInitializerError, compiling:(ring/util/servlet.clj:62)
at clojure.lang.Compiler.analyzeSeq(Compiler.java:6416)
at clojure.lang.Compiler.analyze(Compiler.java:6216)
...
Caused by: java.lang.ExceptionInInitializerError
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:247)
at clojure.lang.RT.classForName(RT.java:2013)
at clojure.lang.Compiler$HostExpr.maybeClass(Compiler.java:938)
at clojure.lang.Compiler$HostExpr.access$400(Compiler.java:710)
at clojure.lang.Compiler.macroexpand1(Compiler.java:6342)
at clojure.lang.Compiler.analyzeSeq(Compiler.java:6395)
... 69 more
Caused by: java.lang.Exception: Cyclic load dependency: [ /servlet ]->/ring/util/servlet->[ /servlet ]
at clojure.core$check_cyclic_dependency.invoke(core.clj:5288)
at clojure.core$load.doInvoke(core.clj:5383)
at clojure.lang.RestFn.invoke(RestFn.java:408)
at clojure.lang.Var.invoke(Var.java:401)
at servlet.<clinit>(Unknown Source)
... 76 more
我的project.clj文件是:
(defproject myproj "0.1"
:description "the sample"
:dependencies [
[org.clojure/clojure "1.3.0"]
[compojure "1.0.4"]
[hiccup "1.0.0"]
[clj-json "0.5.0"]
[ring/ring "1.1.0"]
[clj-http "0.1.1"]
]
:plugins [
[lein-ring "0.7.0"]
]
:ring {:handler routes/start})
如果我刪除:ring {:handler routes/start}
那么我會在其他地方獲得一個NPE。
我不知道我的project.clj中是否遺漏了某些內容,或者是否因此用例而導致lein的特定版本被破壞。 有人可以為我澄清一下嗎?
我有同樣的問題,在我的情況下,解決方案就像做一個簡單
萊因干凈
之前
lein ring uberwar
我認為實際問題是,在某些時候,我的處理程序指向一個不正確/不存在的處理程序,並在目標/ classes目錄中留下了一個servlet.clj。 干凈將刪除此文件。
我解決了這個問題,這對我來說是一個錯誤。 在這里發布答案,以防任何人犯同樣的錯誤。
我在src / routes.clj中有類似的內容:
(defroutes main-routes
(GET "/some/path" [& params] (some-code params))
(route/resources "/")
(route/not-found "not found"))
(def start (run-jetty (handler/site main-routes) {:port 8080}))
這是設置路由的標准代碼,並提供一個鈎子,通過lein ring server-headless從命令行啟動jetty webapp。 除了我聲明start作為全局而不是函數。 這意味着當我運行lein ring服務器時,無頭的東西仍然可以工作,但是當我運行lein ring uberwar時,我最終得到一個奇怪的配置 - 一個完整的jetty服務器將嘗試啟動它的servlet,並且uberwar已經生成了一個servlet並且正試圖將它打包成一個罐子。
當我將我的代碼與compojure示例進行比較時,我總是忽略這種差異,因為def和defn在光學上看起來非常相似。 但無論如何,我只是做了這個改變讓它工作:
(defn start [] (run-jetty (handler/site main-routes) {:port 8080}))
錯誤說明了一切,項目配置中缺少:aot param。 查看此鏈接以使用:aot。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.