我有一个正在编译 Java 和 Clojure 文件的 Leiningen 项目。 Java 文件导入一些从 Clojure 文件生成的类(带有 gen-class)。
当我进行 lein 编译时,我在 Java 文件中的导入中遇到编译错误(说它找不到类)。如果我从项目中删除 Java 文件,执行 lein 编译,添加回 Java 文件,然后再次执行 lein 编译,则一切正常。
因此,就像 Clojure 文件需要在 Java 文件之前编译一样。
顺便说一句,我将 gen 类的 Clojure 文件包含在 :aot 列表中。
这里出了什么问题?
(这个答案中的代码未经测试,尽管它应该可以与 Leiningen 1.x 一起使用(对于 x 的最新值)。)
莱宁根的compile
任务运行javac
自动执行任务,如果您project.clj
指定一个:java-source-path
。它在编译 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))
(Making compile
not call javac
根本可能会打破jar
/ uberjar
.)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)