12

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

4

3 回答 3

15

我有一个完整的 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
  • 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 的示例代码,您可能会发现它很有用。

于 2012-12-24T02:32:45.943 回答
12

尽管你对 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)))

进一步阅读:

于 2012-12-23T19:45:46.303 回答
0

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

于 2013-01-18T18:42:51.820 回答