(在這個答案的代碼是未經測試,但它應該有希望與Leiningen 1.x的工作(近期x的值)。)
Leiningen的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))
(製作compile
不呼叫javac
都可能會打破jar
/uberjar
。)
現在可能不會幫助你,但我發現它通常更容易讓Clojure依賴於Java,並且避免依賴關係以其他方式d。請注意,多邊項目中的循環依賴關係特別令人討厭... – mikera 2012-02-19 02:34:46
你有沒有得到這個工作?我基本上有同樣的問題,試圖解決它[這裏](http://stackoverflow.com/questions/13205723/sandwiching-clojure-between-java-with-leiningen/13205871#13205871)。 – kwenholz 2012-11-03 07:35:45
我不記得告訴你實話。 – 2012-11-05 22:56:57