2012-02-17 27 views
3

我有一個Leiningen項目,它正在編譯Java和Clojure文件。 Java文件導入從Clojure文件生成的一些類(使用gen-class)。Leiningen編譯錯誤Java文件,引用從Clojure文件生成的類

當我執行lein編譯時,我在Java文件中導入了編譯錯誤(稱它找不到這些類)。如果我從項目中刪除Java文件,請執行lein編譯,將Java文件添加回來,然後再次編譯,一切正常。

所以,它就像Clojure文件需要在Java文件之前編譯。

順便說一句,我包含了Clojure文件,該文件生成了aot列表中的類。

這裏怎麼回事?

+1

現在可能不會幫助你,但我發現它通常更容易讓Clojure依賴於Java,並且避免依賴關係以其他方式d。請注意,多邊項目中的循環依賴關係特別令人討厭... – mikera 2012-02-19 02:34:46

+0

你有沒有得到這個工作?我基本上有同樣的問題,試圖解決它[這裏](http://stackoverflow.com/questions/13205723/sandwiching-clojure-between-java-with-leiningen/13205871#13205871)。 – kwenholz 2012-11-03 07:35:45

+0

我不記得告訴你實話。 – 2012-11-05 22:56:57

回答

4

(在這個答案的代碼是未經測試,但它應該有希望與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。)

+0

任何機會,你可以審查您的解決方案作爲插件在[這個問題]嘗試實施(http://stackoverflow.com/questions/13205723/sandwiching-clojure-between-java-with-leiningen/13205871#13205871)?在您建議的代碼放置位置後,我遇到了麻煩。 (我是非常新的構建工具)。謝謝! – kwenholz 2012-11-03 07:37:36