如何为Clojure Noir Web应用程序构建war文件?

5
我能使用这些命令从这个网站的说明中生成并运行一个示例 Web 应用程序:

https://github.com/ibdknox/lein-noir

lein new noir my-project-name
lein run

(我正在使用Java 1.7.0_09 Java HotSpot(TM) Client VM上的Leiningen 2.0.0-preview10)

起始Web应用程序可以正常运行,但我想生成war文件,以便手动部署到我的应用程序服务器(Websphere)。

在Leingen 2中,需要哪些命令或配置才能为Noir项目生成war文件?

为了澄清,这个命令"lein new noir webpoc2"生成一个带有此.clj文件的noir项目。

(defproject webpoc1 "0.1.0-SNAPSHOT"
            :description "FIXME: write this!"
            :dependencies [[org.clojure/clojure "1.4.0"]
                           [noir "1.3.0-beta3"]]
            :main webpoc1.server)

如果我将Ring添加到cl文件中。
:ring {
                   :handler webpoc1.server/handler

}

当我执行命令"lein ring uberwar"时,出现以下结果:
Exception in thread "main" java.lang.RuntimeException: No such var: webpoc1.server/handler, compiling:(
/servlet.clj:1)
        at clojure.lang.Compiler.analyze(Compiler.java:6281)
        at clojure.lang.Compiler.analyze(Compiler.java:6223)
        at clojure.lang.Compiler$InvokeExpr.parse(Compiler.java:3497)
        at clojure.lang.Compiler.analyzeSeq(Compiler.java:6457)
        at clojure.lang.Compiler.analyze(Compiler.java:6262)
        at clojure.lang.Compiler.analyze(Compiler.java:6223)
        at clojure.lang.Compiler$BodyExpr$Parser.parse(Compiler.java:5618)
        at clojure.lang.Compiler$FnMethod.parse(Compiler.java:5054)
        at clojure.lang.Compiler$FnExpr.parse(Compiler.java:3674)
        at clojure.lang.Compiler.analyzeSeq(Compiler.java:6453)
        at clojure.lang.Compiler.analyze(Compiler.java:6262)
        at clojure.lang.Compiler.analyzeSeq(Compiler.java:6443)
        at clojure.lang.Compiler.analyze(Compiler.java:6262)
        at clojure.lang.Compiler.analyze(Compiler.java:6223)
        at clojure.lang.Compiler$InvokeExpr.parse(Compiler.java:3548)
        at clojure.lang.Compiler.analyzeSeq(Compiler.java:6457)
        at clojure.lang.Compiler.analyze(Compiler.java:6262)
        at clojure.lang.Compiler.analyze(Compiler.java:6223)
        at clojure.lang.Compiler$InvokeExpr.parse(Compiler.java:3497)
        at clojure.lang.Compiler.analyzeSeq(Compiler.java:6457)
        at clojure.lang.Compiler.analyze(Compiler.java:6262)
        at clojure.lang.Compiler.analyze(Compiler.java:6223)
        at clojure.lang.Compiler$BodyExpr$Parser.parse(Compiler.java:5618)
        at clojure.lang.Compiler$FnMethod.parse(Compiler.java:5054)
        at clojure.lang.Compiler$FnExpr.parse(Compiler.java:3674)
        at clojure.lang.Compiler.analyzeSeq(Compiler.java:6453)
        at clojure.lang.Compiler.analyze(Compiler.java:6262)
        at clojure.lang.Compiler.analyzeSeq(Compiler.java:6443)
        at clojure.lang.Compiler.analyze(Compiler.java:6262)
        at clojure.lang.Compiler.access$100(Compiler.java:37)
        at clojure.lang.Compiler$DefExpr$Parser.parse(Compiler.java:518)
        at clojure.lang.Compiler.analyzeSeq(Compiler.java:6455)
        at clojure.lang.Compiler.analyze(Compiler.java:6262)
        at clojure.lang.Compiler.analyze(Compiler.java:6223)
        at clojure.lang.Compiler.compile1(Compiler.java:7030)
        at clojure.lang.Compiler.compile1(Compiler.java:7025)
        at clojure.lang.Compiler.compile(Compiler.java:7097)
        at clojure.lang.RT.compile(RT.java:387)
        at clojure.lang.RT.load(RT.java:427)
        at clojure.lang.RT.load(RT.java:400)
        at clojure.core$load$fn__4890.invoke(core.clj:5415)
        at clojure.core$load.doInvoke(core.clj:5414)
        at clojure.lang.RestFn.invoke(RestFn.java:408)
        at clojure.core$load_one.invoke(core.clj:5227)
        at clojure.core$compile$fn__4895.invoke(core.clj:5426)
        at clojure.core$compile.invoke(core.clj:5425)
        at user$eval3.invoke(NO_SOURCE_FILE:1)
        at clojure.lang.Compiler.eval(Compiler.java:6511)
        at clojure.lang.Compiler.eval(Compiler.java:6500)
        at clojure.lang.Compiler.eval(Compiler.java:6501)
        at clojure.lang.Compiler.eval(Compiler.java:6477)
        at clojure.core$eval.invoke(core.clj:2797)
        at clojure.main$eval_opt.invoke(main.clj:297)
        at clojure.main$initialize.invoke(main.clj:316)
        at clojure.main$null_opt.invoke(main.clj:349)
        at clojure.main$main.doInvoke(main.clj:427)
        at clojure.lang.RestFn.invoke(RestFn.java:421)
        at clojure.lang.Var.invoke(Var.java:419)
        at clojure.lang.AFn.applyToHelper(AFn.java:163)
        at clojure.lang.Var.applyTo(Var.java:532)
        at clojure.main.main(main.java:37)
Caused by: java.lang.RuntimeException: No such var: webpoc1.server/handler
        at clojure.lang.Util.runtimeException(Util.java:170)
        at clojure.lang.Compiler.resolveIn(Compiler.java:6740)
        at clojure.lang.Compiler.resolve(Compiler.java:6710)
        at clojure.lang.Compiler.analyzeSymbol(Compiler.java:6671)
        at clojure.lang.Compiler.analyze(Compiler.java:6244)
        ... 60 more
Subprocess failed

由于我对Noir(和Clojure)还很陌生,我正在努力弄清楚这个问题。

2个回答

3
回答我的问题/记录我在leingen noir环境依赖方面的磨难,以帮助其他新手。您可以使用“lein new noir…”命令生成noir项目,但如果您想要war文件,请按以下方式更新这些文件。 project.clj
(defproject noir3 "0.1.0-SNAPSHOT"
            :description "FIXME: write this!"
            :dependencies [[org.clojure/clojure "1.4.0"]
                           [noir "1.3.0-beta10"]
                           [hiccup "1.0.2"]
                           [cheshire "4.0.3"]
                           ]
            :plugins [[lein-ring "0.7.5"]]
            :ring {:handler noir3.server/handler}            

            :main noir3.server)

server.clj

(ns noir3.server
  (:require [noir.server :as server]))

;;(server/load-views-ns 'noir3.views)

(server/load-views "src/noir3/views/")


(def handler (server/gen-handler {:mode :dev
                                  :ns 'noir3}))

(defn -main [& m]
  (let [mode (keyword (or (first m) :dev))
        port (Integer. (get (System/getenv) "PORT" "8080"))]
    (server/start port {:mode mode
                        :ns 'noir3})))

接下来,运行以下命令

  1. "lein run"(检查您的页面是否可访问),
  2. "lein ring server"(检查您的页面是否可访问),
  3. 最后运行"lein ring war" -- 您应该在目标目录中看到war文件。

2

您是否在引用的webpoc1.server中声明了handler?类似于以下方式:

(def handler
  (server/gen-handler {:mode :prod
                       :ns *ns*}))

http://www.webnoir.org/tutorials/others/ 提供了如何在 Ring 中使用 Noir 的说明。


问题是关于jar文件依赖的版本冲突。noir "1.3.0-beta3" jar文件包含了一个与lein-ring不兼容的旧版本hicup。 - user193116

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接