56

笔记

鉴于此 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 用于使用 Jetty 进行本地开发以外的任何事情,即在生产中
  2. 每个人都在没有上下文根的专用 Jetty 上部署 Clojure/Compojure 应用程序(就像人们使用 Node.js 应用程序一样)
  3. 有一种非常简单的方法可以规避我遇到的我不知道的问题

在你看来,这些情况中的哪一个?或者是别的什么?

编辑:

请注意,使用 Maven/Leiningen 创建一个战争文件是轻而易举的事,而不是我的意思。我想知道我必须编写这么多代码才能使 Compojure 与 Tomcat 一起工作,基本的东西,如静态文件服务和上下文根感知,应该开箱即用。

4

7 回答 7

11

我使用以下组合来使这相当轻松:

Cake(包括部署命令)

Lau Jensen 为 web 项目开发的 Cake 模板。

Vagrant (Ruby VM(Virtualbox) 管理工具,依赖于 Chef 或 Puppet)

VPS(来自 Slicehost)

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

cake new webdev *projectname*

请注意,该模板包括 log4j 和 Java 邮件,如果不需要,可以/应该排除它们。它进一步假设您使用的是 Enlive 和 Mustache,但如果那是您的毒药,那么将其更改为 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 文件/var/lib/tomcat6/webapps作为 ROOT.war 符号链接到 Tomcat 的 webapps 目录 ( )。有关如何使用 Vagrant 的更多信息,请参阅 Vagrant网站

要点显示了如何调整 project.clj 以使用 cake deploy 命令的示例。该示例创建了两个上下文 @dev 和 @prod,您可以将它们部署到使用:

cake deploy @dev / cake delpoy @prod

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

于 2011-04-01T17:40:21.853 回答
9

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

查看:

还可以查看 lein-war

于 2011-04-01T15:36:49.537 回答
6

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

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

看来 leiningen-war 背后的人现在正在推荐lein-ring。我已经开始研究了,但到目前为止,我还不能轻松地从中获得通用的战争文件。

我同意,尽管考虑生产部署是这里的一个弱点。

于 2011-04-01T16:01:09.700 回答
3

我正在使用Noir,这是一个建立在 Ring 和 Compojure 之上的 Web 框架。

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

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

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

对于静态文件服务,我把东西放在my-proj/resources/public目录下。对于通过代码访问(读/写)文件,:servlet-context可以使用来自环请求标头。使用上述设置,上下文路径将是:(.getRealPath (ring-request-header :servlet-context) "/WEB-INF/classes/myfile.txt"). Myfile.txt 在my-proj/resources.

于 2011-09-20T11:12:10.813 回答
2

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

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

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

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

于 2011-08-04T05:36:08.810 回答
2

如果您在 Google App Engine 上进行部署,这里有一个很棒的博客http://compojureongae.posterous.com/

即使您没有部署到 GAE,您仍可能会得到一些有用的提示。

于 2011-04-01T10:52:37.117 回答
1

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

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

只需使用lein ring uberjar. 请注意 lein uberjar 中添加的“环”。这是假设您使用的是 lein-ring 插件。

于 2013-04-08T20:13:24.123 回答