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

Posted

技术标签:

【中文标题】如何在 Apache 中集成 Clojure Web 应用程序【英文标题】:How To Integrate Clojure Web Applications in Apache 【发布时间】:2011-07-27 12:29:08 【问题描述】:

注意

鉴于这个 OP 是大约两年前写的,我不想再问同样的问题,我想知道是否存在分步说明,以便我可以将 Noir 或其他 Clojure Web 应用程序集成到 Apache ,无论是 Jetty、Tomcat 还是其他。 Django 也有类似的说明,我想我理解 Python 在 Django 的情况下是作为引擎而不是环框架运行的,因此 Clojure Web 应用程序的情况更加复杂。

尾注

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

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

我很惊讶我必须编写所有这些代码来创建可以在 Jetty 和 Tomcat 上运行的最简单的 Web 应用程序。我对此只有三种可能的解释:

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

您认为哪些情况属于这种情况?还是别的什么?

编辑:

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

【问题讨论】:

+1 我真的很想知道这个问题的结果。 我的答案所附的蛋糕项目模板解决了从 Jetty 为开发 Tomcat 提供应用程序所涉及的问题。 【参考方案1】:

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

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

【讨论】:

这个例子似乎启动了它自己的 Jetty。那是常见的情况吗?【参考方案2】:

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

退房:

https://github.com/weavejester/lein-ring https://github.com/weavejester/lein-beanstalk

也可以看看 lein-war

【讨论】:

查看我对立场答案的评论。 抱歉之前这么无知,把lein-ring和leiningen-war搞混了。 lein-ring 确实很棒,可以满足我的所有需求:lein ring 服务器启动一个 Jetty,lein ring uberwar 构建一个在 Tomcat 中运行的战争,无需任何路由修改。我希望 Maven 有这样的东西,我现在搬到了 Leiningen。【参考方案3】:

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

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

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

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

【讨论】:

创建一个war文件对我来说不是问题,我使用的是Maven,这很容易。但是调整我的应用程序以处理静态文件服务和上下文根等应用程序服务器问题,这需要太多的工作。【参考方案4】:

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

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 文件作为 ROOT.war 符号链接到 Tomcat 的 webapps 目录 (/var/lib/tomcat6/webapps)。有关如何使用 Vagrant 的更多信息,请参阅 Vagrant site。

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

cake deploy @dev / cake delpoy @prod

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

【讨论】:

webdev 应该是一系列食谱中的第一个,如下所示:github.com/klang/cake-recipes 谢谢 - 出于某种原因,提问者似乎不同意 :-)【参考方案5】:

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

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

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

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

【讨论】:

【参考方案6】:

我正在使用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

在开发 Tomcat 期间,我已将 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 下。

【讨论】:

【参考方案7】:

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

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

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

【讨论】:

以上是关于如何在 Apache 中集成 Clojure Web 应用程序的主要内容,如果未能解决你的问题,请参考以下文章

在原生 iOS 应用程序中集成响应式 html 网页并使用 Apache Cordova 进行通信

细说shiro之五:在spring框架中集成shiro

记Spring boot 项目中集成hbase 报错

如何在 Clojure 中生成记忆递归函数?

在Spring中集成shiro

如何通过gen-class在Clojure中生成可序列化的java类?