Merge commit 'danlarkin/build-jar-in-memory'

This commit is contained in:
Phil Hagelberg 2009-11-24 22:20:18 -08:00
commit 39f6ab8be1
2 changed files with 79 additions and 34 deletions

View file

@ -1,19 +1,50 @@
(ns leiningen.jar
"Create a jar containing the compiled code and original source."
(:require [leiningen.compile :as compile]
[lancet])
(:use [leiningen.pom :only [pom]]
[clojure.contrib.duck-streams :only [spit]]
[clojure.contrib.str-utils :only [str-join]]))
(:require [leiningen.compile :as compile])
(:use [leiningen.pom :only [make-pom make-pom-properties]]
[clojure.contrib.duck-streams :only [to-byte-array copy]]
[clojure.contrib.str-utils :only [str-join re-sub]]
[clojure.contrib.java-utils :only [file]])
(:import [java.util.jar Manifest JarEntry JarOutputStream]
[java.io BufferedOutputStream FileOutputStream
ByteArrayInputStream]))
(defn make-manifest [project]
(doto (str (:root project) "/classes/Manifest.txt")
(spit (str-join "\n"
["Created-By: Leiningen"
(str "Built-By: " (System/getProperty "user.name"))
(str "Build-Jdk: " (System/getProperty "java.version"))
(when-let [main (:main project)]
(str "Main-Class: " main))]))))
(Manifest.
(ByteArrayInputStream.
(to-byte-array
(str (str-join "\n"
["Manifest-Version: 1.0" ; DO NOT REMOVE!
"Created-By: Leiningen"
(str "Built-By: " (System/getProperty "user.name"))
(str "Build-Jdk: " (System/getProperty "java.version"))
(when-let [main (:main project)]
(str "Main-Class: " main))])
"\n")))))
(defmulti copy-to-jar (fn [project jar-os spec] (:type spec)))
(defmethod copy-to-jar :path [project jar-os spec]
(doseq [child (file-seq (file (:path spec)))]
(when-not (.isDirectory child)
(let [path (str child)
path (re-sub (re-pattern (str "^" (:root project))) "" path)
path (re-sub #"^/classes" "" path)
path (re-sub #"^/src" "" path)
path (re-sub #"^/" "" path)]
(.putNextEntry jar-os (JarEntry. path))
(copy child jar-os)))))
(defmethod copy-to-jar :bytes [project jar-os spec]
(.putNextEntry jar-os (JarEntry. (:path spec)))
(copy (ByteArrayInputStream. (:bytes spec)) jar-os))
(defn write-jar [project out-filename filespecs]
(with-open [jar-os (JarOutputStream. (BufferedOutputStream.
(FileOutputStream. out-filename))
(make-manifest project))]
(doseq [filespec filespecs]
(copy-to-jar project jar-os filespec))))
(defn jar
"Create a $PROJECT.jar file containing the compiled .class files as well as
@ -21,17 +52,21 @@ the source .clj files. If project.clj contains a :main symbol, it will be used
as the main-class for an executable jar."
([project jar-name]
(compile/compile project)
(pom project "pom-generated.xml" true)
(let [jar-file (str (:root project) "/" jar-name)
filesets [{:dir *compile-path*}
{:dir (str (:root project) "/src")}
;; TODO: place in META-INF/maven/$groupId/$artifactId/pom.xml
;; TODO: pom.properties
{:file (str (:root project) "/pom-generated.xml")}
{:file (str (:root project) "/project.clj")}]]
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)}
{:type :path :path *compile-path*}
{:type :path :path (str (:root project) "/src")}
{:type :path :path (str (:root project) "/project.clj")}]]
;; TODO: support slim, etc
(apply lancet/jar {:jarfile jar-file
:manifest (make-manifest project)}
(map lancet/fileset filesets))
(write-jar project jar-file filespecs)
jar-file))
([project] (jar project (str (:name project) ".jar"))))

View file

@ -1,9 +1,9 @@
(ns leiningen.pom
"Write a pom.xml file to disk for Maven interop."
(:require [lancet])
(:use [clojure.contrib.duck-streams :only [reader writer]]
[clojure.contrib.java-utils :only [file]])
(:import [org.apache.maven.model Model Parent Dependency Repository Scm]
(:use [clojure.contrib.duck-streams :only [reader copy]]
[clojure.contrib.java-utils :only [file as-properties]])
(:import [java.io StringWriter]
[org.apache.maven.model Model Parent Dependency Repository Scm]
[org.apache.maven.project MavenProject]
[org.apache.maven.artifact.ant Pom]))
@ -102,15 +102,25 @@
(.setScm model scm))
model))
(defn make-pom [project]
(doto (Pom.)
(.setProject lancet/ant-project)
(.setMavenProject (MavenProject. (make-model project)))))
(defn make-pom
([project] (make-pom project false))
([project disclaimer?]
(with-open [w (StringWriter.)]
(.writeModel (MavenProject. (make-model project)) w)
(when disclaimer?
(.write w disclaimer))
(.getBytes (str w)))))
(defn make-pom-properties [project]
(with-open [w (StringWriter.)]
(.store (as-properties {:version (:version project)
:groupId (:group project)
:artifactId (:name project)})
w "Leiningen")
(.getBytes (str w))))
(defn pom [project & [pom-location silently?]]
(let [pom-file (file (:root project) (or pom-location "pom.xml"))]
(with-open [w (writer pom-file)]
(.writeModel (MavenProject. (make-model project)) w)
(.write w disclaimer)
(when-not silently? (println "Wrote" (.getName pom-file))))
(copy (make-pom project true) pom-file)
(when-not silently? (println "Wrote" (.getName pom-file)))
(.getAbsolutePath pom-file)))