我正在考虑开始使用(不玩)Clojure。有什么有用的指南吗?我不是在询问 lein、javac 或任何其他“小型”手动工具。我需要知道如何在同一个项目中的 eclipse 中拥有 Java 和 Clojure 源代码。如何让他们在没有编译错误的情况下互相调用?如何配置maven?如何建立完全生产的开发环境?目前甚至可能吗?哪些插件可能有用?从哪儿开始?
3 回答
我有一个完整的 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/java
和src/main/clojure
- Clojure 只是一个 Maven 依赖项,就像任何其他 Java 库一样。
- 我将 Clojure 源目录设置为 Maven 设置中的资源目录。这意味着
.clj
文件捆绑在任何 jar 中,并且可以在运行时动态加载/运行。 - 我通常像往常一样在 Java 端创建入口点
public static void main(...)
,但很快调用到 Clojure 代码。请参阅这篇关于从 Java 调用 Clojure 的博客文章。
最后是多语言 Java+Clojure 的一些编码技巧
- 我发现 Java 更适合低级数据结构、库和算法,而 Clojure 更适合将事物集成在一起和“粘合”代码。
- Clojure 调用 Java 通常比反过来更容易/更优雅。这也是有道理的,因为您通常希望依赖项以这种方式流动(更高级别的代码调用更低级别的代码)
- 如果您将所有 Java 类都设为不可变,那么它们在 Clojure 世界中运行得非常好,而且工作量很小。
- 有时值得让您的一个或多个 Java 类实现某些 Clojure 接口,尤其
clojure.lang.IFn
是例如。这样,您的 Java 对象就可以充当 Clojure 代码中的第一类函数。
这是一个混合 Java 和 Clojure 源代码的示例项目:
我还编写了一个小型库 ( clojure-utils ),其中包含一些用于从 Java 调用 Clojure 的示例代码,您可能会发现它很有用。
尽管你对 leiningen 的语气,我还是建议你看看。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)))
进一步阅读:
您也可以尝试框架“Funky”。它将完全分离您的 Clojure 和 Java 代码。看看https://github.com/windler/Funky