如何在Apache中集成Clojure Web应用程序

注意

鉴于这个OP是在两年前写的,而不是再次提出同样的问题,我想知道是否存在分步说明,以便我可以将Noir或其他Clojure Web应用程序集成到Apache中,无论是Jetty,Tomcat , 或者是其他东西。 Django也有类似的说明,我认为我知道Python在Django的情况下是作为一个引擎而不是一个环形框架运行的,所以Clojure的web应用程序更加复杂。

结束注释

我深深爱上了Clojure,而Compojure看起来像是一个整洁的Web框架。

但是,当我想将我的应用程序部署在像Tomcat这样的常规应用程序服务器上时,这一切都崩溃了。 实际上,我必须为静态文件和资源编写自定义的Ring处理程序,这些文件和资源可以在本地的Jetty和Tomcat上工作,因为库存处理程序没有,并且我必须在任何地方手动预置上下文根。

我感到非常惊讶的是,我不得不编写所有这些代码来创build可以在Jetty和Tomcat上运行的最简单的Web应用程序。 我只有三个可能的解释:

  1. 没有人使用Clojure / Compojure进行本地开发,例如在生产中
  2. 每个人都在没有上下文根的专用Jetty上部署Clojure / Compojure应用程序(像Node.js应用程序一样)
  3. 有一个非常简单的方法来规避我碰到的问题,我没有意识到

你认为哪个是这种情况? 或者是别的什么?

编辑:

请注意,创build一个战争文件是Maven / Leiningen,而不是我的意思。 我想知道我必须编写如此多的代码才能使Compojure能够与Tomcat一起工作,像静态文件服务和上下文根认知这样的基本function应该可以直接使用。

人们正在将Compojure应用程序部署到非Jetty servlet容器。

查看:

也检查lein战争

我使用以下的组合来使这相当无痛:

Cake (包含部署命令)

Lau Jensen开发的Web项目的蛋糕模板。

Vagrant (Ruby VM(Virtualbox)pipe理工具,依靠Chef或Puppet)

VPS(来自Slicehost)

关键部分是Lau制作的webdev模板。 webdev文件夹应该放在~/.cake/templates 。 基于它创build一个新的项目使用:

 cake new webdev *projectname* 

请注意,该模板包括log4j和Java邮件,如果不需要,可以/应该排除这些邮件。 它进一步假定你正在使用Enlive和胡须,但改变Compojure /打嗝是微不足道的,如果这是你的毒药。

该模板负责从开发中的docker提供应用程序(您只是eval server.clj),并在Tomcat下运行时作为战争。 如果在Tomcat下作为ROOT.war部署到服务器,则路由保持相同。 所有静态文件应位于资源目​​录中。 docker将从那里为他们服务(感谢Ring文件中间件)。 在生产中,这些移动到webapp的根目录,并由Tomcat(web.xml负责处理)从那里提供。

devbox文件夹包含一个Vagrantfile以及用于创build安装了Tomcat的Virtualbox VM所需的食谱。 我使用cake来将.war文件部署到/home/vagrant目录(这是通过project.clj中的开发环境的定义来控制的)。 .war文件作为ROOT.war被链接到Tomcat的webapps dir( /var/lib/tomcat6/webapps )中。 有关如何使用Vagrant的更多信息,请参阅Vagrant 网站 。

这个要点展示了一个如何调整project.clj来使用cake deploy命令的例子。 这个例子创build了两个你可以使用的上下文@dev和@prod:

 cake deploy @dev / cake delpoy @prod 

我收集了这个zip文件中的Cake webdev模板和Vagrant文​​件。

我用leiningen-war取得了一些成功,生成了一个通用的战争文件(当然,假设你正在使用leiningen)。 它允许你在你的project.clj文件中指定静态html的位置,web.xml的位置和其他资源。

生成一个能够部署到JBoss(通过Tomcat作为servlet容器运行)的通用war文件并不难,但是我认为你必须非常熟悉web.xml格式。 我更喜欢编写我自己的web.xml,这样可以说明我更喜欢这种方法。

莱宁根战争背后的人似乎现在正在推荐列宁环 。 我已经开始考虑这个了,但是到目前为止,我还没有能够从中获得一个通用的战争文件。

我同意,虽然生产部署的会计在这里是一个弱点。

我使用Noir ,一个build立在Ring和Compojure之上的Web框架。

我已经使用lein noir new my-proj创build了项目。 然后我创build了my-proj/web目录,并添加了以下几行

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

我在Tomcat开发期间将my-proj/web目录设置为上下文根。

对于静态文件服务,我把东西放在my-proj/resources/public目录下。 要通过代码访问(读取/写入)文件,可以使用来自响铃请求标题的:servlet-context 。 通过以上设置,上下文path将为:(. (.getRealPath (ring-request-header :servlet-context) "/WEB-INF/classes/myfile.txt") 。 Myfile.txt位于my-proj/resources

如果您在Google App Engine上进行部署,请点击这里http://compojureongae.posterous.com/

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

我已经发布了一个Compojure + Vaadin应用程序(超过6个月)。 包装已经使用lein-war插件完成,我没有遇到任何重大问题。

该应用程序被命名为halo,包含在halo.war文件中,上下文是/ halo,并且tomcat服务器也运行Hudson,以及另一个自定义应用程序。 Vaadin正在解决所有我的静态文件,CSS,图像…我主要使用该博客文章来写它所需的小胶水。

另一方面,我也在Heroku上运行Noir,在包装和部署方面没有任何问题,这也在生产中。

这与你的Compojure问题没有直接关系,但是Clojure在Web应用程序中的生产是肯定的。

如果您使用的是基于环的服务器(compojure,noir / lib-noir,luminus等),并且想要部署为uberjar,则要避免

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

只需用lein ring uberjar创buildlein ring uberjar 。 注意lein uberjar除了“ring”之外。 这假设你正在使用lein-ring插件。