3

构建 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 在这个用例中被破坏了。有人可以为我澄清一下吗?

4

3 回答 3

2

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

莱茵清洁

之前

莱因戒指超级战争

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

于 2012-05-20T22:26:25.873 回答
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 并且正在尝试将其打包成罐子。

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

(defn start [] (run-jetty (handler/site main-routes) {:port 8080}))  
于 2012-07-19T20:19:07.130 回答
0

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

于 2012-05-20T15:40:25.923 回答