查看Leiningen教程中文版的源代码
←
Leiningen教程中文版
跳转到:
导航
、
搜索
因为以下原因,你没有权限编辑本页:
您刚才请求的操作只有这个用户组中的用户才能使用:
用户
您可以查看并复制此页面的源代码:
== 使用项目 == 通常来讲,Leiningen项目的有三种典型的不同用途: * 可以分发给终端用户的应用 * 服务端应用 * 其他Clojure项目可以使用的类库 对于第一种用途,通常会构建一个uberjar。对于类库,你会想将它们发布到Clojars或者私有的某个仓库。对于服务端应用,会如下文描述的那样有所变化。利用<code>lein new app myapp</code>生成一个项目,会让你从拥有一些额外默认(配置)适合非类库项目开始。 === Uberjar === 最简单的事情是分发一个uberjar。这是一个单一的独立的可执行jar文件,特别适合给非技术用户。为了让它工作,你必须设置命名空间,作为project.clj里的<code>:main</code>。此时,我们的project.clj看起来像这样: (defproject my-stuff "0.1.0-SNAPSHOT" :description "FIXME: write description" :url "http://example.com/FIXME" :license {:name "Eclipse Public License" :url "http://www.eclipse.org/legal/epl-v10.html"} :dependencies [[org.clojure/clojure "1.3.0"] [org.apache.lucene/lucene-core "3.0.2"] [clj-http "0.4.1"]] :profiles {:dev {:dependencies [[midje "1.3.1"]]}} :test-selectors {:default (complement :integration) :integration :integration :all (fn [_] true)} :main my.stuff) 你设置的命名空间必须包含一个<code>-main</code>函数,它将在独立的可执行文件运行的时候被调用。这个命名空间必须在顶层的<code>ns</code> form里有一个<code>:gen-class</code>声明,<code>-main</code>函数会接收命令行参数,让我们在<code>src/my/stuff.clj</code>尝试点简单的玩意: (ns my.stuff (:gen-class)) (defn -main [& args] (println "Welcome to my project! These are your args:" args)) 现在我们已经准备好产生一个uberjar: $ lein uberjar Compiling my.stuff Compilation succeeded. Created /home/phil/src/leiningen/my-stuff/target/my-stuff-0.1.0-SNAPSHOT.jar Including my-stuff-0.1.0-SNAPSHOT.jar Including clj-http-0.4.1.jar Including clojure-1.3.0.jar Including lucene-core-3.0.2.jar Created /home/phil/src/leiningen/my-stuff/target/my-stuff-0.1.0-SNAPSHOT-standalone.jar 这样将创建一个包含了所有依赖内容的单一jar文件。用户可以通过<code>java</code>调用运行它,或者在某些操作系统上,可以通过双击该jar文件来运行。 $ java -jar my-stuff-0.1.0-standalone.jar Hello world. Welcome to my project! These are your args: (Hello world.) 你可以利用<code>java</code>命令行运行一个普通的(非uber)jar,但是这需要你自己构建classpath,对于终端用户来说这不是一个好办法。 当然,如果你的用户已经安装了Leiningen,你可以教导他们使用上文介绍的<code>lein run</code>。 === 框架 (Uber)jars === 大多数Java框架要求一个部署(deployment)配置,来自一个jar文件或者衍生的打包子格式,包含应用必需的依赖库的一个子集。框架希望能在运行时能自己提供缺失的依赖库。框架提供的这种方式的依赖库,通常在<code>:provided</code>配置里。这样的依赖库将在编译、测试等阶段有效,但是默认不会被包含在<code>uberjar</code>任务或者创建稳定部署artifacts的插件任务里。(译注:熟悉maven的朋友一定知道provided scope吧) 例如,Hadoop job的jar可能仅仅是一个普通的(uber)jar文件,包含了所有的依赖,除了Hadoop类库自身: (project example.hadoop "0.1.0" ... :profiles {:provided {:dependencies [[org.apache.hadoop/hadoop-core "0.20.2-dev"]]}} :main example.hadoop) $ lein uberjar Compiling example.hadoop Created /home/xmpl/src/example.hadoop/example.hadoop-0.1.0.jar Including example.hadoop-0.1.0.jar Including clojure-1.4.0.jar Created /home/xmpl/src/example.hadoop/example.hadoop-0.1.0-standalone.jar $ hadoop jar example.hadoop-0.1.0-standalone.jar 12/08/24 08:28:30 INFO util.Util: resolving application jar from found main method on: example.hadoop 12/08/24 08:28:30 INFO flow.MultiMapReducePlanner: using application jar: /home/xmpl/src/example.hadoop/./example.hadoop-0.1.0-standalone.jar ... 插件被要求产生框架部署jar的衍生物(例如WAR文件),包含了额外的元信息;但是<code>:provided</code>配置提供了更通用的机制来处理框架依赖。 === 服务端项目 === 有很多种方式可以让你的项目作为服务端应用来部署。除了明显的uberjar方式之外,简单的程序可以使用[https://github.com/technomancy/lein-tar lein-tar]插件伴随着shell脚本打包成[http://en.wikipedia.org/wiki/Tarball tarball],然后使用[http://hugoduncan.github.com/pallet/ pallet],[http://opscode.com/chef/ chef]或者其他机制部署。Web应用可以作为uberjar部署,利用<code>ring-jetty-adapter</code>使用内嵌的Jetty,或者是使用[https://github.com/weavejester/lein-ring lein-ring插件]创建的.war文件。在uberjar之外,服务端部署是如此多变,以至于更好使用插件而非Leiningen内置的任务来处理。 如果你最终在生产环境里使用了类似<code>lein trampoline run</code>的任务来运行,那么确保你在部署之前采取了冻结所有依赖的措施,否则最终很容易会以[https://github.com/technomancy/leiningen/wiki/Repeatability 不可重复的部署]终结。考虑在你的部署单元里,连同项目代码包含<code>~/.m2/repository</code>。使用Leiningen在一个持续的集成配置里创建一个可部署的artifact是推荐的做法。例如,你可以用[http://jenkins-ci.org Jenkins]作为持续集成服务器(CI)来跑项目的所有测试套件,如果测试通过,上传tarball到S3(译者注:amazon的Simple Storage Service)。那么部署就变成只是在你的生产服务器下载并解压一个已知是良好的tarball的事情。 另外,请记住<code>run</code>任务默认会包括<code>user</code>,<code>dev</code>和<code>default</code>配置项,这些并不适合生产环境。使用<code>lein trampoline with-profile production run -m myapp.main</code>是更推荐做法的。默认情况下,生产配置是空的,但是如果你的部署包含了<code>~/.m2/repository</code>,这个部署是从产生tarball的CI运行得来的,那么你应该在<code>:production</code>配置里添加它的路径作为<code>:local-repo</code>,并且和<code>:offline? true</code>一起。保持离线,可以让已经部署的项目跟CI环境里测试的版本彻底分开。 === 发行类库 === 如果你的项目是一个类库,并且你想让别人可以在他们的项目里将它作为依赖类库来使用,你就需要把它放到一个公开的仓库里。虽然你可以[https://github.com/technomancy/leiningen/blob/master/doc/DEPLOY.md 维护一个你自己的私有仓库],或者放到[http://search.maven.org Central]仓库,但是最简单的办法还是发布到[http://clojars.org Clojars]。当你[https://clojars.org/register 创建一个帐号]后,发布变得很简单: $ lein deploy clojars Created ~/src/my-stuff/target/my-stuff-0.1.0-SNAPSHOT.jar Wrote ~/src/my-stuff/pom.xml No credentials found for clojars See `lein help deploying` for how to configure credentials. Username: me Password: Retrieving my-stuff/my-stuff/0.1.0-SNAPSHOT/maven-metadata.xml (1k) from https://clojars.org/repo/ Sending my-stuff/my-stuff/0.1.0-SNAPSHOT/my-stuff-0.1.0-20120531.032047-14.jar (5k) to https://clojars.org/repo/ Sending my-stuff/my-stuff/0.1.0-SNAPSHOT/my-stuff-0.1.0-20120531.032047-14.pom (3k) to https://clojars.org/repo/ Retrieving my-stuff/my-stuff/maven-metadata.xml (1k) from https://clojars.org/repo/ Sending my-stuff/my-stuff/0.1.0-SNAPSHOT/maven-metadata.xml (1k) to https://clojars.org/repo/ Sending my-stuff/my-stuff/maven-metadata.xml (1k) to https://clojars.org/repo/ 一旦发布成功,这个类库将将作为一个包(package),可以在别的项目里依赖它。通过保存你凭证的指令,你就不需要每次都重新输入它们,查看<code>lein help deploying</code>。当发布一个非snapshot的release的时候,Leiningen会尝试使用[http://gnupg.org GPG]来对它进行签名,证明你对这个release的著作权。查看[https://github.com/technomancy/leiningen/blob/rc/doc/DEPLOY.md 部署指南]获取详细的设置信息。部署指南也包括了如何部署到其他仓库的指令。
返回到
Leiningen教程中文版
。
个人工具
登录
名字空间
页面
讨论
变换
查看
阅读
查看源代码
查看历史
操作
搜索
导航
首页
社区专页
新闻动态
最近更改
随机页面
帮助
工具箱
链入页面
相关更改
特殊页面