【问题标题】:What Is The Reason For The Lein Cyclic Dependency Error When I build uberwar?构建 uberwar 时出现 Lein 循环依赖错误的原因是什么?
【发布时间】:2012-05-20 14:14:47
【问题描述】:

构建 ring server-headless 可以工作 -- lein ring server-headless -- 但是当我尝试构建 war 或 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 是否损坏,或者我的项目是否设置不正确。据我所知,我已经正确设置了项目,但我无法让一个常见的用例正常工作。请告诉我为什么这是一个糟糕的问题,或者为什么它不是一个“真正的”问题。
  • 我自己解决了这个问题。发布的答案都不正确。
  • 基本问题是routes/start 被声明为def 而不是defn(未提供问题,因为直到我解决了问题后我才意识到它是相关的)。一个很容易被忽视的非常小的细节,但回想起来我看到的行为是完全合理的。
  • 很高兴你知道了。如果重新打开,也许可以发布一个详细的答案?
  • @Kevin:前段时间我自己也遇到过这个问题。你能发布一个详细的答案吗?我会觉得它很有帮助。

标签: clojure leiningen ring


【解决方案1】:

我遇到了同样的问题,在我的情况下,解决方案就像做一个一样简单

洗干净

之前

lein ring 超级战争

我认为实际问题是,在某些时候,我的处理程序指向了一个不正确/不存在的处理程序,并且在 target/classes 目录中留下了一个 servlet.clj。执行清理将删除此文件。

【讨论】:

  • 相当肯定我试过了,但我会再试一次,看看会发生什么
【解决方案2】:

我解决了这个问题,这对我来说有点错误。在这里发布答案,以防有人犯同样的错误。

我在 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 server-headless 时,事情仍然有效,但是当我运行 lein ring uberwar 时,我最终得到了一个奇怪的配置——一个完整的码头服务器将尝试使用它的 servlet 启动,并且 uberwar 已经生成了一个 servlet 并且正在尝试将其打包到 jar 中。

当我将我的代码与组合示例进行比较时,我一直错过了这种差异,我猜是因为 def 和 defn 在光学上看起来非常相似。但无论如何,我只是做了这个改变来让它工作:

(defn start [] (run-jetty (handler/site main-routes) {:port 8080}))  

【讨论】:

    【解决方案3】:

    错误说明了一切,项目配置中缺少 :aot 参数。查看 this link 使用 :aot。

    【讨论】:

    • 这是一个网络应用程序,所以它没有主程序。我认为 Lein 会自动生成 servlet?在某一时刻肯定是这样......
    • 我可以添加:aot :all,当我运行lein ring uberwar(好)时堆栈跟踪消失了,但它启动了webapp,就像我运行了server-headless(坏)一样。
    猜你喜欢
    • 2021-04-09
    • 2018-11-16
    • 2017-02-20
    • 2020-03-27
    • 2013-04-14
    • 1970-01-01
    • 1970-01-01
    • 2020-12-10
    • 1970-01-01
    相关资源
    最近更新 更多