2012-02-17 5 views
3

JavaとClojureファイルの両方をコンパイルしているLeiningenプロジェクトがあります。 Javaファイルは、Clojureファイルから生成されたいくつかのクラス(gen-class付き)をインポートします。Clojureファイルから生成されたクラスを参照するJavaファイルのコンパイルエラー

私がleinコンパイルを実行すると、Javaファイルのインポート時にコンパイルエラーが発生します(クラスが見つかりません)。私がプロジェクトからJavaファイルを削除した場合は、leinコンパイルを行い、Javaファイルを追加して、再度コンパイルしてください。すべてうまくいきます。

Clojureファイルは、Javaファイルの前にコンパイルする必要があります。

ところで、私は:aotリストにgenクラスを含むClojureファイルを含めています。

ここで何が問題になりますか?

+1

おそらくあなたを助けることはありませんが、私はClojureをJavaに依存させるのが通常簡単であることを発見しました。 d。そして、多言語プロジェクトの周期的な依存関係は、特に厄介です... – mikera

+0

これはこれまでうまく動作しましたか?私は基本的に同じ問題を抱えています。それに対処しようとしています(ここでは、http://stackoverflow.com/questions/13205723/sandwiching-clojure-between-java-with-leiningen/13205871#13205871)。 – kwenholz

+0

私はあなたに真実を伝えるのを忘れない。 –

答えて

4

(それがうまくいけば()xの最近の値についてLeiningenを1.xではで動作するはずですが、この答えのコードは、テストされていません。)あなたのproject.clj指定する場合

Leiningenをのcompileタスクは自動的にjavacタスクを実行しますa :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の最後の形式は、(。全くcompileないコールjavacはおそらくjar/uberjarを破る作る)

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

する必要があります

+0

[この質問](http://stackoverflow.com/questions/13205723/sandwiching-clojure-between-java-with-leiningen/13205871#13205871)のプラグインとして、ソリューションの実装を試してみることができますか?私は、あなたが提案したコードをどこに置くかについて問題がありました。 (私はツールを作るために非常に新しいです)。ありがとう! – kwenholz

関連する問題