如何通过逆时针(或la clojure)运行/调试compojure web app

如何通过逆时针(或la clojure)运行/调试compojure web app,clojure,compojure,counterclockwise,la-clojure,Clojure,Compojure,Counterclockwise,La Clojure,我正在尝试用compojure编写我的第一个web应用程序。我正在使用ccw,我将新项目、Clojure项目归档,并使用“compojure”leiningen模板。以project.clj的样子结束 (defproject asdf "0.1.0-SNAPSHOT" :description "FIXME: write description" :url "http://example.com/FIXME" :dependencies [[org.clojure/clojure "

我正在尝试用compojure编写我的第一个web应用程序。我正在使用ccw,我
将新项目、Clojure项目归档,并使用“compojure”leiningen模板。以project.clj的样子结束

(defproject asdf "0.1.0-SNAPSHOT"
  :description "FIXME: write description"
  :url "http://example.com/FIXME"
  :dependencies [[org.clojure/clojure "1.4.0"]
                 [compojure "1.1.5"]]
  :plugins [[lein-ring "0.8.2"]]
  :ring {:handler asdf.handler/app}
  :profiles
  {:dev {:dependencies [[ring-mock "0.1.3"]]}})
src/asdf/handler.clj看起来像

(ns asdf.handler
  (:use compojure.core)
  (:require [compojure.handler :as handler]
            [compojure.route :as route]))

(defroutes app-routes
  (GET "/" [] "Hello World")
  (route/not-found "Not Found"))

(def app
  (handler/site app-routes))
我发现我可以使用
leinringserver
从命令行运行它,但我不确定如何从eclipse运行它。我当然希望不仅能够运行它,而且能够调试它并设置断点等等。在eclipse中有这样做的方法吗?或者,如果没有,那么IntelliJ/La Clojure呢?(目前我有点害怕emacs,但如果它超级简单,我可能会尝试一下)

或者,这不是compojure应用程序的典型开发过程吗?(如果没有,是什么?只需运行
leinringserver
并祈祷?)


如果有什么不同的话,这是在Win7上。

这里有一个配方,对我开发戒指应用程序非常有用:

  • 确保为您的项目正确配置了leiningen支持(如有疑问,请执行一次):
    • 在包资源管理器中,选择项目,并调用上下文命令
      Leiningen>Reset configuration
    • 然后还调用
      Leiningen>updatedependencies
      命令
    • 您应该在项目中看到一个
      Leiningen Dependencies
      虚拟节点,引用项目的直接依赖项和可传递依赖项
  • 选择
    asdf.handler
    文件,右键单击,然后
    Debug as>Clojure应用程序
  • 在编辑器中打开
    asdf.handler
    命名空间
  • 光标当前仍在编辑器中,键入
    Ctrl+Alt+N
    跳转到REPL,同时将REPL的当前名称空间切换到
    asdf.handler
  • 通过键入
    (app)
    +
    Enter
    (或
    Ctrl+Enter
    (如果光标不在行尾)启动应用程序
现在,您可以在编辑器和REPL之间导航

  • 要将编辑器内容发送到REPL,请选择它,然后点击
    Ctrl+Enter
  • 如果在没有选择的情况下按Ctrl+Enter键,整个“顶级表达式”(例如defn)将发送到REPL
  • 要将整个文件重新发送到REPL,请键入
    Ctrl+Alt+S
  • 以下是特定于CCW的所有键盘快捷键列表:

请注意,逆时针方向的未来版本将与Leiningen 2进行更多的集成,但就目前的情况而言,开发
ring
应用程序的本质使得如上所述的引导过程并不那么痛苦,IMHO

您可以通过以下步骤在IntelliJ IDEA和La Clojure上运行Compojure/Ring应用程序:

  • 使用
    leinpom
    命令从leiningen的
    project.clj
    生成
    pom.xml
  • 照常使用IntelliJ IDEA导入maven项目。您可能需要确保类路径中有Clojure jar
  • 加载项目后,可以使用工具->启动Clojure控制台启动Clojure REPL
  • 要将Clojure文件加载到REPL,请选择工具->Clojure REPL->将文件加载到REPL
  • 之后,要启动一个Ring应用程序,您只需加载一个Clojure文件,该文件调用
    Ring.adapter.jetty/运行jetty

    http://localhost:4004/
    将如下所示:

    (require 'compojure.core)
    (require 'ring.adapter.jetty)
    
    (ring.adapter.jetty/run-jetty
      (compojure.core/routes (compojure.core/ANY "/" [] "Hello world!"))
      {:port 4004 :join? false})
    
    :join?
    选项很重要,如果将其设置为true(默认值),REPL将不接受更多命令。您的路由通常会更复杂,并且
    compojure。应使用核心/defroutes
    或其他方式

    您可以将这样的文件放在
    test
    路径中,这样在IDEA之外运行项目时就不会加载它。 如果Clojure方面没有添加到您的模块中,您可以在文件->项目结构->模块中添加它

    这里提供了一个完整的示例(jetty重新加载):-使用IDEA完成开发,并在Heroku上运行真实站点:

    调试使用上述技术运行的Clojure应用程序也是可能的-您只需:

  • 在IntelliJ IDEA中创建远程调试运行配置文件
  • 在File->Project Structure->Modules->[your module]->Clojure facet->JVM Arguments字段中,从上面的概要文件(例如,
    agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005)中添加适当的JVM选项到REPL设置
  • 使用工具启动REPL->启动Clojure控制台
  • 启动远程调试配置文件

  • 之后,您可以添加断点、检查变量等。

    在键入
    (app)
    时,我得到
    ArityException错误的参数数(0)传递给:cookies$wrap cookies$fn clojure.lang.AFn.throwArity(AFn.java:437)
    。哦,是的,对不起:
    app
    只是主处理程序,不是服务器。您需要创建一个启动服务器的函数,类似于
    (defn start[](运行jetty#app{:join?false}))
    ,并且不要忘记向名称空间添加require:
    (:require[ring.adapter.jetty:only[run jetty]])
    。因此,您必须调用的是
    (start)
    ,而不是
    (app)
    几乎,我发现
    在类路径上找不到ring/adapter/jetty\u init.class或ring/adapter/jetty.clj,这样就出现了错误,但后来我在compojure的wiki上找到了这个链接,下面的第二节解决了这个问题:事实上,回顾过去,我想如果我只是添加了[ring]到项目依赖项(compojure仅依赖于[ring/ring core]),它会起作用。哦,是的,好的。对不起,我没有做compojure开发,但是做了直环开发,所以我不知道compojure还没有将ring.adapter.jetty添加到依赖项中。所以现在ccw和webapp开发对您来说一切都好了吗?
    (需要'asdf.handler')(使用'ring.server.standalone')(为asdf.handler/app提供服务)
    对于compojure来说是一个更简单的测试文件。