Merge commit 'danlarkin/build-jar-in-memory'
This commit is contained in:
commit
39f6ab8be1
2 changed files with 79 additions and 34 deletions
|
@ -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"))))
|
||||
|
|
|
@ -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)))
|
||||
|
|
Loading…
Reference in a new issue