2012-02-19 28 views
2

我正在开发一些使用REPL的polyglot Java + Clojure代码(在Eclipse中使用CounterClockwise和Maven)。在这种情况下,只需在REPL中加载源并开始与代码交互即可。在Eclipse中为REPL和应用程序部署都设置Clojure代码

但是,我最终希望能够以.jar文件或类似方式分发和部署代码,以便它可以作为独立应用程序运行。在这种情况下,代码需要作为具有适当的main(...)函数的Java应用程序来执行。我希望从Maven pom.xml文件干净地构建。

到目前为止,我有代码工作,以便我有一个-main函数,当我在REPL中使用Clojure时不会调用,但应该在打包/部署为jar时调用。这似乎有效,但我不确定这是否代表最佳方法。

理想情况下,我想一切都在顺利工作:

  • 逆时针REPL
  • 标准的Maven构建过程,导致完全打包/部署的jar文件

什么是建立一个Clojure代码库的最佳实践,以便它可以很容易地在REPL中使用并构建一个独立的应用程序?

回答

3

这可能与REPL体验造成影响的唯一的事情是,当在REPL需要的命名空间应该不会运行顶层侧effecty的说法,然而,其中一个可能希望有一个命名空间发生(可能间接地)在REPL中需要。很明显,这只是一个坏主意(如果似乎像某种方式的有用安排 - 例如对于Leiningen的复杂钩子 - 命名空间应该可以拆分为包含定义的名称空间和带有副作用代码的名称空间)。

运行的应用程序的固有模式将取决于以下类别它落入的:

  1. 主要切入点Clojure中
    1. 不介意的Clojure的代码AOT编译
    2. 更喜欢避免AOT
  2. Java的主要切入点(Clojure的东西通过clojure.lang.RT调用)

For 1.1。自然的做法是在应用程序的jar的manifest.mf中使用:gen-class'd命名空间作为Main-Class。然后你可以使用java -jar(如果它是一个überjar/独立的罐子)/ java -cp <app's cp> app.main来启动它。如果您在project.clj中指定:main财产,Leiningen可以帮助您解决此问题;看到它是如何最流行的构建工具和其选择支持这种方法(据我所知)没有吸引批评,人们或许可以称之为地道。 Maven可以做同样的与平时pom.xml咒语指定主类。

For 1.2。,你可以做Leiningen做的事情:提供一个叫做clojure.main的包装,其中包含-e "(use 'app.core)(-main)"作为参数。

为2,没有什么特定的Clojure左右推出。

+0

谢谢米哈尔 - 非常有用和伟大的查看所有可行的选项列举! – mikera 2012-02-19 05:00:56

+0

不用担心。祝贺[clojure]徽章! :-) – 2012-02-19 05:55:55

+0

谢谢....虽然不知道如果我应得,但仍然有很多东西要学! – mikera 2012-02-19 07:33:13

相关问题