(The code in this answer is untested, although it should hopefully work with Leiningen 1.x (for recent values of x).)
Leiningen's compile
task runs the javac
task automatically if your project.clj
specifies a :java-source-path
. It does so prior to compiling Clojure sources, because I suppose that's the usual direction of the dependency.
To get around this, you could use a 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)
Place this somewhere on your build-time classpath and add
:hooks [clj-first-hook]
to your project map.
Note that javac
, when called directly, will still not call compile
. You could also make it equivalent to compile
e.g. by hooking it with the following function:
(defn javac-hook [javac-task project]
(if (project ::clj-compiled?)
(javac/javac project)
(leinc/compile project)))
The last form of compile-clj-first-hook
would then need to be
(javac/javac (assoc project ::clj-compiled? true))
(Making compile
not call javac
at all would probably break jar
/ uberjar
.)