Clojure和Java在现实世界中互操作

时间:2012-12-23 18:52:33

标签: java eclipse java-ee maven clojure

我正在考虑开始使用(不玩)Clojure。有没有有用的指南?我不是在询问lein,javac或任何其他“小型”手动工具。我需要知道如何在同一个项目中使用eclipse中的Java和Clojure源代码。如何在没有编译错误的情况下让他们互相调用?如何配置maven?如何建立完全富有成效的开发环境?现在甚至可能吗?哪些插件可能有用?从哪里开始?

3 个答案:

答案 0 :(得分:14)

我有一个完全正常的生产设置,Eclipse,Maven和Clojure目前工作得非常好。希望它有助于作为Java IDE中良好的多语言设置的一个例子。

我不使用leiningen - 根本没有反对lein - 它在纯粹的Clojure / CLI世界中非常漂亮和理想。但是我发现使用IDE可以更好地使用纯Maven在多语言Java + Clojure环境中工作,因为工具集成要好得多。此外,从生态系统/受众/社区的角度来看,如果您希望Java世界的人能够构建您的源代码,那么如果您直接使用Maven,则会减少混淆。

这是我的设置:

  • Eclipse 4.2作为主IDE
  • Counterclockwise Eclipse插件 - 非常好,负责REPL,Clojure编辑等。
  • Maven用于管理所有项目(我主要使用内置的Eclipse Maven集成,但偶尔也会使用CLI版本)
  • cljunit用于启用JUnit测试以在项目的Clojure部分上运行
  • Github / Travis CI用于SCM和持续集成,使用Eclipse中内置的EGit团队提供程序访问

实际上我如何管理/设置项目本身:

  • 我使用Maven配置所有内容,使用标准的Maven目录布局。 Polyglot Java + Clojure项目通常同时具有src/main/javasrc/main/clojure
  • Clojure只是一个Maven依赖项,就像任何其他Java库一样。
  • 我将Clojure源目录放入Maven设置中的资源目录中。这意味着.clj文件捆绑在任何jar中,并且可以在运行时动态加载/运行。
  • 我通常像往常一样使用public static void main(...)在Java端创建入口点,但很快就调用Clojure代码。请参阅calling Clojure from Java上的此博文。

最后一些针对多语言Java + Clojure的编码技巧

  • 我发现Java对于低级数据结构,库和算法更好,而Clojure更适合将事物集成在一起并“粘合”代码。
  • Clojure调用Java通常比其他方式更容易/更优雅。这也是有道理的,因为您通常希望依赖关系以这种方式流动(更高级别的代码调用更低级别的代码)
  • 如果你让所有的Java类都不可变,那么它们在Clojure世界中只需很少的努力就能很好地发挥作用。
  • 有时值得让一个或多个Java类实现一些Clojure接口,例如clojure.lang.IFn。这样,您的Java对象就可以充当Clojure代码中的第一类函数。

这是一个混合Java和Clojure源的示例项目:

我还写了一个小型库(clojure-utils),其中包含一些用于从Java调用Clojure的示例代码,您可能会发现它很有用。

答案 1 :(得分:11)

尽管你对莱宁根有所了解,但我建议你去看看。 Leiningen支持Java编译,因此在一个项目中组合java和clojure源不是问题。

逆时针插件,Eclipse的clojure插件,可以与leiningen项目文件(project.clj)一起使用。因此,在Eclipse中,您可以通过在project.clj中定义正确的内容来为您处理依赖关系管理和Java编译,而无需单独安装leiningen或从命令行执行命令。

在project.clj中设置:java-source-paths ,例如:

:java-source-paths ["src/main/java"] 

在包src / main / java中放一个类Foo:

package main.java;

public class Foo {
    public static final String value = "Michiel";
}

在clojure源文件中的某个地方定义此函数,并在调用时打印“Michiel”:

(defn foo
  "I don't do a whole lot."
  []
  (println (main.Foo/value)))

进一步阅读:

答案 2 :(得分:0)

您也可以尝试“Funky”框架。它将完全将您的Clojure和Java代码分开。只需查看https://github.com/windler/Funky

即可