【问题标题】:Setting up Clojure code in Eclipse for both REPL and application deployment在 Eclipse 中为 REPL 和应用程序部署设置 Clojure 代码
【发布时间】:2012-02-19 02:05:58
【问题描述】:

我大部分时间都在使用 REPL 开发一些多语言 Java + Clojure 代码(在带有 CounterClockwise 和 Maven 的 Eclipse 中)。在这种情况下,只需在 REPL 中加载源代码并开始与代码交互即可。

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

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

理想情况下,我希望两者都能顺利进行:

  • 逆时针REPL
  • 一个标准的 Maven 构建过程,它产生一个完全打包/部署的 jar 文件

设置 Clojure 代码库以便在 REPL 中轻松使用并构建独立应用程序的最佳实践是什么?

【问题讨论】:

    标签: java eclipse deployment maven clojure


    【解决方案1】:

    唯一可能干扰 REPL 体验的是顶级副作用语句,当 REPL 需要命名空间但出现在可能想要拥有的命名空间中时(可能间接),它不应该运行REPL 需要。显然,这只是一个坏主意(如果它似乎在某种程度上是一种有用的安排——例如,对于 Leiningen 有复杂的钩子——命名空间可能应该被拆分为一个包含定义的命名空间和一个包含副作用代码)。

    运行应用程序的自然模式将取决于它属于以下哪个类:

    1. Clojure 中的主要入口点
      1. 不介意 Clojure 代码的 AOT 编译
      2. 宁愿避免 AOT
    2. Java 中的主入口点(通过 clojure.lang.RT 调用 Clojure 内容)

    对于 1.1。自然的方法是在应用程序的 jar 的 manifest.mf 中使用 :gen-class'd 命名空间作为 Main-Class。然后您可以使用java -jar(如果它是 überjar / 独立 jar)/java -cp <app's cp> app.main 来启动它。如果您在 project.clj 中指定 :main 属性,Leiningen 会对此有所帮助;看看它是如何成为最受欢迎的构建工具以及它支持这种方法的选择(据我所知)没有引起任何批评,人们可能称之为惯用语。 Maven 可以用通常的pom.xml 咒语指定主类来做同样的事情。

    对于 1.2.,您可以执行 Leiningen 所做的事情:提供一个调用 clojure.main 的包装器,并使用类似于 -e "(use 'app.core)(-main)" 的内容作为参数。

    对于 2.,此次发布没有任何 Clojure 特定内容。

    【讨论】:

    • 感谢 Michal - 非常有用,很高兴看到所有可行选项的枚举!
    • 不用担心。恭喜获得 [clojure] 徽章! :-)
    • 谢谢....
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多