将Clojure集成到现有的Java项目中?

时间:2010-02-02 02:51:11

标签: clojure

如何获取现有的大型Java项目并开始添加Clojure模块?例如,在下面的代码中,我想在Java中提供以下功能: state?,zip?,state-list,zipcode-list 。两个谓词将返回一个布尔值,但“getters”将返回数组。

(def *states* (list "NJ" "NY" "CA"))
(def *zipcodes*  (list 12345 54343 98765))

(defn member [x sq]
  (if (seq sq)
    (if (= x (first sq))
      sq
      (recur x (rest sq)))))

(defn state? [aState]
  (not (= (member aState *states*) nil)))

(defn zip? [aZip]
  (not (= (member aZip *zipcodes*) nil)))

(defn state-list []
  *states*)

(defn zipcode-list []
  *zipcodes*)
;; ---------------
(state? "AA")
(state? "CA")
(zip? 11111)
(zip? 12345)

3 个答案:

答案 0 :(得分:11)

我会使用leininge n编译它然后将jar文件作为构建dep添加到我的java项目中。这是使用leiningen的一个很棒的video。 然后你可以直接从java调用它。 Leiningen有一个uberjar选项,可以使用clojure和你所有的clojure依赖项,因此你只需要担心一个文件。我喜欢这个因为它的工作少了。

更友好的java方法是添加一个ant任务来构建它与java项目一起再做一点工作

对于需要返回正确的java数组的函数,在它们上面调用to-array

与许多顶级“从java调用clojure”命中相反,你不应该调用clojure运行时RT。

PS:我最喜欢的标语行“我想使用一个名为clojure的java库”我问Rich他说这很酷;)

答案 1 :(得分:2)

使用现有的Java应用程序并将其包装在Clojure中比使用其他方式更容易,因为来自Clojure的Java interop非常简单。

当您询问如何从Java访问Clojure时,答案是您需要引导加载Clojure代码,或者需要生成可以从Java项目中使用的Java类文件。 Bootstrapping涉及链接到clojure jar并访问load函数以加载clojure源。要生成Java类,请查看AOT(请参阅网站上的示例)。

答案 2 :(得分:2)

我推荐的方法如下:

  • 继续使用您的主要构建工具管理Java项目(可能是Maven?)
  • 添加Clojure作为依赖项。它将像任何其他库.jar文件
  • 一样工作
  • 从Java调用Clojure代码。一个典型的用例是require命名空间来执行此操作,获取对您要调用的任何IFn的引用,并通过IFn.invoke
  • 调用该函数

我推荐这种方法,因为将Clojure添加到Java项目而不是相反的方法通常更简单:如果您有其他开发人员要考虑或正在使用假定常规Java项目的工具,则尤其如此。它对管理者来说也不那么可怕了:你所做的只是使用一个额外的小Java库: - )

我创建了一个小实用程序库,它可以完成从Java调用Clojure所需的大量工作,您可能会发现它很有用: