我有一个正在编译 Java 和 Clojure 文件的 Leiningen 项目。 Java 文件导入一些从 Clojure 文件生成的类(使用 gen-class)。
当我进行 lein 编译时,我在 Java 文件中的导入中遇到编译错误(说它找不到类)。如果我从项目中删除 Java 文件,执行 lein 编译,重新添加 Java 文件,然后再次执行 lein 编译,一切正常。
所以,就像 Clojure 文件需要在 Java 文件之前编译一样。
顺便说一句,我在 :aot 列表中包含生成类的 Clojure 文件。
这里出了什么问题?
最佳答案
(此答案中的代码未经测试,但它应该有望与 Leiningen 1.x 一起使用(对于 x 的最新值)。)
莱宁根的 compile
任务运行 javac
如果您的 project.clj
会自动执行任务指定 :java-source-path
.它在编译 Clojure 源代码之前这样做,因为我认为这是依赖项的通常方向。
要解决这个问题,您可以使用钩子(Hook):
;;; 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]
到您的项目 map 。
请注意 javac
, 当直接调用时,仍然不会调用 compile
.你也可以让它等同于 compile
例如通过使用以下函数 Hook 它:
(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
。)
关于java - 引用从 Clojure 文件生成的类的 Java 文件的 Leiningen 编译错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9336202/