【问题标题】:mixing java and clojure files in a single package将 java 和 clojure 文件混合在一个包中
【发布时间】:2014-10-17 14:03:09
【问题描述】:

我在将 clojure 和 java 文件混合编译到一个包中时遇到了麻烦。这些文件之间存在依赖关系,如果它们都是 java 文件,java 编译器可以处理所有这些。为了具体化,我想创建一个名为 pkg 的包,其中包含 4 个文件:A.java、b.clj、c.clj 和 D.java。 a.java包含main并创建b.clj中声明的对象,b.clj调用c.clj中的函数并使用D类的对象。如何编写项目文件?

如果我使用

 :prep-tasks ["javac" "compile"]

在项目文件中,然后我在编译 A.java 时收到一条抱怨 pkg.b 或 pkg.c 中的某些内容未定义。如果我使用

 :prep-tasks ["compile" "javac"]

我收到了关于 pkg.D 类不存在的投诉。如果我尝试

 :prep-tasks [["javac" "pkg/D.java"] "compile" "javac"]

即使我正确设置了 java-source-paths,它也找不到 pkg/D.java。

处理此问题的一种方法是创建 3 个包,一个包含 A.java,一个包含 b.clj 和 c.clj,一个包含 D.java。然后为 D.java 构建一个 jar,为 b 和 c 构建一个使用 D.jar 的 jar,为 A 构建一个使用 bc.jar 和 D.jar 的 jar。不过很丑。

【问题讨论】:

    标签: java clojure interop leiningen


    【解决方案1】:

    您不能在单个 lein 项目中的 java 和 clojure 源之间存在循环依赖关系。正如您正确指出的那样,您可以将项目拆分为多个包以避免循环依赖,但您不需要 3 个包而只需 2 个,因为 lein 支持Clojure -> Java dependencies。所以你可以有一个包含 b、c 和 D 的项目,而另一个只有 A 的项目。

    另一种选择是在 Clojure 中编写 A,这样您就可以避免多个项目的负担。

    【讨论】:

    • 我把它拆成 3 个包。一旦处理了依赖关系,就很容易制作 3 而不是 2。无论如何都需要一个 makefile。我不想重写它,因为 A 真的是 gui 而 D 是数据。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-08
    • 1970-01-01
    • 1970-01-01
    • 2016-02-23
    • 2011-05-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多