之前我从未做过任何类型的网络编程,所以我不知道我需要做些什么来获得我写的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>
以下是我的实际问题。
如何让Clojure在服务器上执行。我一直在驱逐这个代码并从(def server(jetty/run-jetty #'app {:port 8080 :join? false}))
开始?
此外,将此项目纳入视图的正确方法是什么(即文件结构)。服务器上的文件结构就是 顶级:bin public_html 在public_html中是cgi-bin index.html startingclojure(我的应用程序,来自教程)
是您在输入该页面时看到的,并且startingclojure具有leiningen文件结构。
我不确定我是否提供了所有必要的信息,但我很乐意提供您可能需要的任何信息来帮助我开始。提前谢谢。
答案 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
对象)的任何引用。
可能需要一段时间来解决所有这些环境间的差异,但幸运的是,每个步骤都可以在您完善时在本地进行测试。