diff --git a/src/leiningen/clean.clj b/src/leiningen/clean.clj index bdca3cdf..13064ac2 100644 --- a/src/leiningen/clean.clj +++ b/src/leiningen/clean.clj @@ -1,14 +1,13 @@ (ns leiningen.clean "Remove compiled files and dependencies from project." - (:use [leiningen.jar :only [get-jar-filename get-default-jar-name - get-default-uberjar-name]] + (:use [leiningen.jar :only [get-jar-filename get-default-uberjar-name]] [clojure.contrib.io :only [file delete-file delete-file-recursively]])) (defn clean "Remove compiled files and dependencies from project." [project] (println "Cleaning up.") - (doseq [f [(get-jar-filename project (get-default-jar-name project)) + (doseq [f [(get-jar-filename project) (get-jar-filename project (get-default-uberjar-name project)) (:compile-path project)]] (delete-file-recursively f true))) diff --git a/src/leiningen/jar.clj b/src/leiningen/jar.clj index 6e64be2b..30be6a18 100644 --- a/src/leiningen/jar.clj +++ b/src/leiningen/jar.clj @@ -66,15 +66,35 @@ (or (:jar-name project) (str (:name project) "-" (:version project) ".jar"))) -(defn get-jar-filename [project jar-name] - (let [jar-dir (:jar-dir project)] - (.mkdirs (file jar-dir)) - (str jar-dir "/" jar-name))) +(defn get-jar-filename + ([project jar-name] + (let [jar-dir (:jar-dir project)] + (.mkdirs (file jar-dir)) + (str jar-dir "/" jar-name))) + ([project] (get-jar-filename project (get-default-jar-name project)))) (defn get-default-uberjar-name [project] (or (:uberjar-name project) (str (:name project) \- (:version project) "-standalone.jar"))) +(defn- filespecs [project] + [{:type :bytes + :path (format "meta-inf/maven/%s/%s/pom.xml" + (:group project) + (:name project)) + :bytes (make-pom project)} + {:type :bytes + :path (format "meta-inf/maven/%s/%s/pom.properties" + (:group project) + (:name project)) + :bytes (make-pom-properties project)} + (when (and (:resources-path project) + (.exists (file (:resources-path project)))) + {:type :path :path (:resources-path project)}) + {:type :path :path (:compile-path project)} + {:type :path :path (:source-path project)} + {:type :path :path (str (:root project) "/project.clj")}]) + (defn jar "Create a $PROJECT-$VERSION.jar file containing the compiled .class files as well as the source .clj files. If project.clj contains a :main symbol, it will @@ -82,24 +102,8 @@ be used as the main-class for an executable jar." ([project jar-name] (binding [compile/*silently* true] (compile/compile project)) - (let [jar-path (get-jar-filename project jar-name) - filespecs [{:type :bytes - :path (format "meta-inf/maven/%s/%s/pom.xml" - (:group project) - (:name project)) - :bytes (make-pom project)} - {:type :bytes - :path (format "meta-inf/maven/%s/%s/pom.properties" - (:group project) - (:name project)) - :bytes (make-pom-properties project)} - (when (and (:resources-path project) - (.exists (file (:resources-path project)))) - {:type :path :path (:resources-path project)}) - {:type :path :path (:compile-path project)} - {:type :path :path (:source-path project)} - {:type :path :path (str (:root project) "/project.clj")}]] - (write-jar project jar-path filespecs) + (let [jar-path (get-jar-filename project jar-name)] + (write-jar project jar-path (filespecs project)) (println "Created" jar-path) jar-path)) ([project] (jar project (get-default-jar-name project)))) diff --git a/src/leiningen/uberjar.clj b/src/leiningen/uberjar.clj index 8c9b4fce..72306362 100644 --- a/src/leiningen/uberjar.clj +++ b/src/leiningen/uberjar.clj @@ -5,8 +5,7 @@ [clojure.java.io :only [file copy]] [clojure.contrib.zip-filter.xml :only [xml-> tag=]] [leiningen.clean :only [clean]] - [leiningen.jar :only [get-default-jar-name get-jar-filename - get-default-uberjar-name jar]]) + [leiningen.jar :only [get-jar-filename get-default-uberjar-name jar]]) (:import [java.util.zip ZipFile ZipOutputStream ZipEntry] [java.io File FileOutputStream PrintWriter])) @@ -39,6 +38,22 @@ [(into skip-set (copy-entries zipfile out #(skip-set (.getName %)))) (concat components (read-components zipfile))])) +(defn- write-components [deps out] + ;; TODO: need documentation; I have no idea what this is for. Alex! + (let [[_ components] (reduce (partial include-dep out) + [#{"META-INF/plexus/components.xml"} nil] + deps)] + (when-not (empty? components) + (.putNextEntry out (ZipEntry. "META-INF/plexus/components.xml")) + (binding [*out* (PrintWriter. out)] + (xml/emit {:tag :component-set + :content + [{:tag :components + :content + components}]}) + (.flush *out*)) + (.closeEntry out)))) + (defn uberjar "Create a jar like the jar task, but including the contents of each of the dependency jars. Suitable for standalone distribution." @@ -46,24 +61,12 @@ the dependency jars. Suitable for standalone distribution." (clean project) (jar project) (let [standalone-filename (get-jar-filename project uberjar-name)] - (with-open [out (-> (file standalone-filename) - (FileOutputStream.) (ZipOutputStream.))] + (with-open [out (-> standalone-filename + (FileOutputStream.) + (ZipOutputStream.))] (let [deps (->> (.listFiles (file (:library-path project))) (filter #(.endsWith (.getName %) ".jar")) - (cons (file (get-jar-filename - project (get-default-jar-name project))))) - [_ components] (reduce (partial include-dep out) - [#{"META-INF/plexus/components.xml"} nil] - deps)] - (when-not (empty? components) - (.putNextEntry out (ZipEntry. "META-INF/plexus/components.xml")) - (binding [*out* (PrintWriter. out)] - (xml/emit {:tag :component-set - :content - [{:tag :components - :content - components}]}) - (.flush *out*)) - (.closeEntry out)))) + (cons (file (get-jar-filename project))))] + (write-components project out))) (println "Created" standalone-filename))) ([project] (uberjar project (get-default-uberjar-name project))))