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

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

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

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

这是我的设置:

  • Eclipse 4.2作为主IDE
  • 逆时针 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
  • 与任何其他Java库一样,Clojure只是一个Maven依赖项。
  • 我将Clojure源目录放入Maven设置中的资源目录中。 这意味着.clj文件捆绑在任何jar中,并且可以在运行时动态加载/运行。
  • 我通常像往常一样使用public static void main(...)在Java端创建入口点,但很快调用Clojure代码。 请参阅这篇关于从Java调用Clojure的博客文章。

最后一些编码提示多语言Java + Clojure

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

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

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

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

Counterclockwise插件,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))) 

进一步阅读:

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