必要的代码更改以在本地运行服务器

时间:2013-11-28 23:41:32

标签: clojure httpserver

之前我从未做过任何类型的网络编程,所以我不知道我需要做些什么来获得我写的Clojure应用程序才能在实时服务器上运行。我页面的网址为http://rowdy.msudenver.edu/~jnels124/。这是我的Clojure代码

(ns startingclojure.core
  (:use (compojure handler[core :only (GET POST defroutes)]) 
        [clojure.pprint])
  (:require [net.cgrand.enlive-html :as en]
            [ring.util.response :as response]
            [ring.adapter.jetty :as jetty]))
(defonce counter (atom 10000))
(defonce urls (atom {}))
( defn shorten 
  [url]
  (let [id (swap! counter inc)
        id (Long/toString id 36)]
    (swap! urls assoc id url)
    id))

(en/deftemplate homepage
 (en/xml-resource "homepage.html") 
  [request]
  [:#listing :li] 
  (en/clone-for [[id url] @urls] 
                [:a] (comp ;; comp composes any number of functions 
                        (en/content (format "%s : %s" id, url))
                        (en/set-attr :href (str \/ id)))))                
(defn redirect 
  [id] 
  (response/redirect (@urls id)))

(defroutes app*;; * ususally means implementation detail or lower level operation
  (GET "/" request (homepage request)) 
  (POST "/shorten" request 
        (let [id (shorten (-> request :params :url))] 
         (response/redirect "/")))
  (GET "/:id" [id] (redirect id)))
(def app (compojure.handler/site app*))

这是html

<html>
        <head>
                <link type="text/css" rel="stylesheet" href="style.css"/>
        </head>
        <body>
                <form method="POST" action="/shorten">
                        <input type="text" name="url"/>
                        <input type="submit" value="Shorten!"/>
                </form>
                <ul id="listing">
                        <li>
                                <a href="/shorturl">id :url</a>
                        </li>
                </ul>
        </body>
</html>

以下是我的实际问题。

  1. 如何让Clojure在服务器上执行。我一直在驱逐这个代码并从(def server(jetty/run-jetty #'app {:port 8080 :join? false}))开始?

  2. 此外,将此项目纳入视图的正确方法是什么(即文件结构)。服务器上的文件结构就是   顶级:bin public_html   在public_html中是cgi-bin index.html startingclojure(我的应用程序,来自教程)

  3. 索引html中的

    是您在输入该页面时看到的,并且startingclojure具有leiningen文件结构。

    我不确定我是否提供了所有必要的信息,但我很乐意提供您可能需要的任何信息来帮助我开始。提前谢谢。

1 个答案:

答案 0 :(得分:0)

在生产箱上运行lein甚至是repl是一个坏主意。

如果在本地执行-main,您应该定义一个lein run函数来创建和运行您的Web服务器进程。然后,当您准备部署时,运行lein uberjar以创建包含整个应用程序及其所有依赖项的jar。在服务器上拥有该jar文件后,您可以通过java -jar my-app.jar运行它。您可能需要一个脚本,该脚本还设置所有正确的Java执行变量及其应运行的端口等(这些可以在命令行中提供,并作为字符串传递给-main)。

如果应用程序需要解压缩某些文件,则需要提取jar(或至少jar的那一部分),并确保应用程序进程可以在运行时找到它。 jar是一个zip文件,可以使用命令行中的unzip命令解压缩。如果您需要引用仍在jar中的资源进行读取,则应使用clojure.java.io.file替换对File(或本机java clojure.java.io/resource对象)的任何引用。

可能需要一段时间来解决所有这些环境间的差异,但幸运的是,每个步骤都可以在您完善时在本地进行测试。