2011-04-01 21 views
55

注意如何整合Clojure的Web應用程序中的Apache

鑑於這種OP是大約兩年前寫的,而不是再次問同樣的問題,如果有一步一步的指示,我想知道,所以我可以將Noir或其他Clojure Web應用程序集成到Apache中,無論是Jetty,Tomcat還是其他。 Django也有類似的說明,我認爲我知道Python在Django的情況下是作爲引擎而不是環形框架運行的,所以Clojure Web應用程序更復雜。

末注

我深深愛上了Clojure中,和的Compojure似乎是一個整潔的Web框架。

但是,當我想將應用程序部署在像Tomcat這樣的常規應用程序服務器上作爲WAR時,它全部崩潰。實際上,我必須爲靜態文件和資源編寫自定義的Ring處理程序,這些文件和資源可以在本地Jetty和Tomcat上工作,因爲庫存處理程序沒有,並且我必須在任何地方手動預置上下文根。

我感到非常驚訝,我不得不編寫所有這些代碼來創建可以運行在Jetty和Tomcat上的最簡單的Web應用程序。我只有三個可能的解釋是:

  1. 沒有人使用的Clojure /的Compojure比生產地方發展與碼頭,即任何其他
  2. 每個人都部署在專用碼頭的Clojure /的Compojure應用,而無需上下文根(如人的Node.js應用程序做)
  3. 有規避我遇到了我不知道的

哪一個是你的意見的情況下的問題非常簡單的方法?或者是別的什麼?

編輯:

請注意,創建war文件是一個沒有腦子與Maven/Leiningen,而不是我的意思。我想知道我必須編寫如此多的代碼才能使Compojure能夠與Tomcat一起工作,像靜態文件服務和上下文根感知這樣的基本內容,應該可以開箱即用。

+4

+1我真的會對這個問題的結果感興趣。 – 2011-04-01 09:12:19

+0

附加到我的答案的蛋糕項目模板照顧從Jetty開發*和* Tomcat服務應用程序中解決的問題。 – mac 2011-04-04 12:44:06

回答

9

人們正在將Compojure應用程序部署到非Jetty servlet容器。

退房:

還檢查了雷音戰

+0

查看我對stand的回答的評論。 – futlib 2011-04-02 19:46:48

+0

對不起,早些時候如此無知,混淆lein-ring與leiningen-war。 lein-ring的確非常棒,我只想要:lein ring服務器啓動Jetty,lein ring uberwar構建一個可以在Tomcat中工作而不需要修改路由的戰爭。我希望Maven有這樣的事情,現在我搬到了Leiningen。 – futlib 2011-09-26 18:36:45

2

如果你在谷歌App Engine的部署,這裏是一個偉大的博客http://compojureongae.posterous.com/

您仍然可以得到,即使你沒有部署到GAE一些有用的提示。

+0

這個例子似乎啓動它自己的Jetty。那麼常見的情況是什麼? – futlib 2011-04-01 12:50:30

6

我不得不使用leiningen-war生成一個通用的戰爭文件中的一些成功(假設你正在使用leiningen,當然)。它允許你在你的project.clj文件中指定靜態html的位置,web.xml的位置和其他資源。

對於我來說,生成一個能夠部署到JBoss的通用war文件並不困難(作爲servlet容器運行Tomcat),但我認爲您必須非常熟悉web.xml格式。我更喜歡編寫我自己的web.xml,這樣可以說明我更喜歡這種方法。

看來,萊寧寧格戰後面的人現在正在推薦lein-ring。我已經開始關注這個問題,但到目前爲止,我還沒有能夠輕鬆獲得通用的戰爭文件。

我同意,雖然生產部署的核算是一個弱點。

+0

創建一個war文件對我來說不是問題,我使用的是Maven,這是一個不容易的事情。但是,調整我的應用程序以處理應用程序服務器問題,如靜態文件服務和上下文根,這需要太多的工作。 – futlib 2011-04-02 19:45:47

11

我用下面的組合,使這個相當容易:

Cake(含部署命令)

由劉延森開發webprojects蛋糕模板。

Vagrant(紅寶石VM(VirtualBox的)管理工具,其依賴於廚師或木偶)

VPS(從Slicehost)

的關鍵部分是Webdev的模板劉製成。 webdev文件夾應放置在~/.cake/templates中。要創建基於它使用一個新的項目:

cake new webdev *projectname* 

請注意,模板包括如果不需要的話,可以/應排除的log4j和Java郵件。它進一步假設你正在使用Enlive和鬍鬚,但如果那是你的毒藥,那麼將它改成Compojure/Hiccup是微不足道的。

該模板負責爲開發中的jetty提供應用程序(您只是eval server.clj),並在Tomcat下運行時用作戰爭。如果作爲Tomcat下的ROOT.war部署到服務器,則路由保持相同。所有靜態文件應位於資源目​​錄中。 Jetty將從那裏爲他們提供服務(感謝Ring文件中間件)。在生產中,這些移動到webapp的根目錄,並由Tomcat(web.xml負責處理)從那裏提供。

devbox文件夾包含創建安裝了Tomcat的Virtualbox VM所需的Vagrantfile和食譜。我使用cake來將.war文件部署到/home/vagrant目錄(這是通過project.clj中的開發環境定義來控制的)。 .war文件作爲ROOT.war鏈接到Tomcat的webapps目錄(/var/lib/tomcat6/webapps)中。有關如何使用Vagrant的更多信息,請參閱Vagrant site

這個gist顯示了一個如何調整項目的例子。clj使用cake deploy命令。該示例創建兩個背景@dev和@prod可以部署使用:

cake deploy @dev/cake delpoy @prod 

我收集到的蛋糕Webdev的模板,並在此zip的流浪文件。

+1

'webdev'應該是食譜中的第一個,像這樣的東西:https://github.com/klang/cake-recipes – klang 2011-04-04 15:07:31

+2

這是一個很棒的答案。 – mtnygard 2011-04-05 03:51:44

+0

謝謝 - 出於某種原因提問者似乎不同意:-) – mac 2011-04-13 21:38:27

2

我已經發布了一個Compojure + Vaadin應用程序(現在已經超過6個月)。打包使用lein-war插件完成,我沒有遇到任何重大問題。

應用程序被命名爲halo,包含在halo.war文件中,上下文是/ halo,並且tomcat服務器也運行Hudson以及另一個自定義應用程序。 Vaadin正確解決我所有的靜態文件,CSS,圖像... 我主要使用blog post來編寫它需要的小膠水。

另一方面,我也在運行Noir,Heroku,並且在包裝和部署方面沒有任何問題,並且這也在生產中。

這不是直接關係到你的Compojure問題,而是Clojure在web應用程序中的生產,肯定的。

3

我正在使用Noir,這是一個構建在Ring和Compojure之上的Web框架。

我已經使用lein noir new my-proj創建了項目。然後,我創建了my-proj/web目錄和發展Tomcat的過程中添加以下行

project.clj:  
    :compile-path "web/WEB-INF/classes" 
    :library-path "web/WEB-INF/lib" 
    :ring {:handler project.server/handler} 

我已經設置my-proj/web目錄上下文根。

對於靜態文件服務,我把東西放在my-proj/resources/public目錄下。 要通過代碼訪問(讀取/寫入)文件,可以使用來自振鈴請求標頭的:servlet-context。通過以上設置,上下文路徑將爲:(.getRealPath (ring-request-header :servlet-context) "/WEB-INF/classes/myfile.txt")。 Myfile.txt位於my-proj/resources之下。

1

如果您使用的是基於環的服務器(的Compojure,黑色/ lib目錄輒,Luminus公司等),並希望部署爲uberjar,避免

"Failed to load Main-Class manifest attribute from your-uberjar.jar" 

簡單地創建與uberjar lein ring uberjar。請注意lein uberjar的'ring'。這假設你正在使用lein-ring插件。

相關問題