繁体   English   中英

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

[英]Clojure and Java interop in a real world

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

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

我没有使用leiningen - 根本没有反对lein - 它在纯粹的Clojure / CLI世界中非常漂亮和理想。 但是我发现使用IDE可以更好地使用纯Maven在多语言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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM