【问题标题】:Leiningen compiling error with Java files that reference classes generated from Clojure filesLeiningen 使用引用从 Clojure 文件生成的类的 Java 文件编译错误
【发布时间】:2012-03-09 07:43:58
【问题描述】:

我有一个 Leiningen 项目,它同时编译 Java 和 Clojure 文件。 Java 文件导入一些从 Clojure 文件生成的类(使用 gen-class)。

当我进行 lein compile 时,我在 Java 文件中的导入中遇到编译错误(说它找不到类)。如果我从项目中删除 Java 文件,执行 lein 编译,重新添加 Java 文件,然后再次执行 lein 编译,一切正常。

所以,就像 Clojure 文件需要在 Java 文件之前编译一样。

顺便说一句,我在 :aot 列表中包含了生成类的 Clojure 文件。

这里出了什么问题?

【问题讨论】:

  • 现在可能对你没有帮助,但我发现让 Clojure 依赖于 Java 通常更容易,并且反过来避免依赖。请注意,多语言项目中的循环依赖特别令人讨厌......
  • 你有没有让这个工作?我遇到了基本相同的问题,正在尝试解决它here
  • 我不记得告诉你真相了。

标签: java compilation clojure interop leiningen


【解决方案1】:

(此答案中的代码未经测试,尽管它有望与 Leiningen 1.x 一起使用(对于 x 的最新值)。)

如果您的project.clj 指定:java-source-path,Leiningen 的compile 任务会自动运行javac 任务。它在编译 Clojure 源代码之前这样做,因为我认为这是依赖项的通常方向。

要解决这个问题,您可以使用钩子:

;;; in leiningen.hooks.clj_first.clj

(ns leiningen.hooks.clj-first
  (:require [leiningen.compile :as leinc]
            [leiningen.javac :as javac]))

(defn compile-clj-first-hook [compile-task project & args]
  (apply compile-task
         (dissoc project :java-source-path)
         args))
  (javac/javac project))

(add-hook #'leiningen.compile/compile compile-clj-first-hook)

将它放在构建时类路径中的某个位置并添加

:hooks [clj-first-hook]

到您的项目地图。

注意javac,当直接调用时,仍然不会调用compile。您也可以使其等同于compile,例如通过将其与以下功能挂钩:

(defn javac-hook [javac-task project]
  (if (project ::clj-compiled?)
    (javac/javac project)
    (leinc/compile project)))

compile-clj-first-hook 的最后一种形式需要是

(javac/javac (assoc project ::clj-compiled? true))

(让compile调用javac可能会破坏jar/uberjar。)

【讨论】:

  • 您是否有机会在this question 中查看您的解决方案作为插件的尝试实现?我在跟踪您建议的代码的位置时遇到了麻烦。 (我对构建工具非常陌生)。谢谢!
猜你喜欢
  • 1970-01-01
  • 2019-07-04
  • 1970-01-01
  • 2015-05-27
  • 2022-12-24
  • 1970-01-01
  • 2018-05-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多