簡體   English   中英

當我建立超級戰爭時,導致循環依賴性錯誤的原因是什么?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM