tools.build
tools.build
is a recently released library that helps you write build scripts in Clojure. Whilst it includes basic functions for building JAR files, depstar
offers more sophisticated functionality, with more control over how AOT compilation is performed and how the JAR files are built. For example, depstar
handles more types of files when merging resources into the JAR (including concatenation of LICENSE files and full merging of log4j2 plugin cache files), lets you exclude files via regex from the JAR, accepts additional key/value pairs for the manifest file, and so on.
To use depstar
as a library, in your build.clj
script, your :build
alias should look something like this:
:build {:deps {io.github.clojure/tools.build
{:tag "v0.1.3" :sha "688245e"
:exclusions [org.slf4j/slf4j-nop]}
com.github.seancorfield/depstar
{:tag "v2.1.267" :sha "a970a33"}}
:ns-default build}
Since depstar
relies on tools.deps.alpha
and tools.logging
, you need to exclude the no-op version of the slf4j logging library from tools.build
to avoid a conflict.
Note: the above assumes you have the prerelease version 1.10.3.905 of the Clojure CLI installed! Version 1.10.3.855 is the latest stable version as of
depstar
2.1.267. See Source Libs and Builds for details about the new functionality in this recent prerelease, which includes support for:tag
/:sha
source coordinates. You can find the latest tagged version ofdepstar
using this command:clojure -X:deps find-versions :lib com.github.seancorfield/depstar
There are two approaches available for using depstar
for build tasks:
tools.build
as usual, except use depstar
for jar
and uber
tasks,depstar
's higher-level tasks for building JAR files instead.tools.build
-compatible APIYour build.clj
script will start like this:
(ns build
(:require [clojure.tools.build.api :as b]
[hf.depstar.api :as d]))
With this approach, you use tools.build
functions for everything except jar
and uber
, where you use depstar
's versions, that accept the exact same input parameters. For example:
(defn jar [_]
(b/write-pom {:class-dir class-dir
:lib lib
:version version
:basis basis
:src-dirs ["src"]})
(b/copy-dir {:src-dirs ["src" "resources"]
:target-dir class-dir})
;; replacement for b/jar:
(d/jar {:class-dir class-dir
:jar-file jar-file}))
Running clojure -T:build jar
will run the jar
task defined above using the :build
alias.
hf.depstar.api/jar
accepts :class-dir
, :jar-file
, and :main
. It additionally accepts any of depstar
's options that can affect building a JAR file, such as :aliases
(for calculating the project basis), :exclude
, :manifest
, :paths-only
, :repro
(to exclude consideration of the user deps.edn
file), :verbose
, etc.
Similarly for uber
:
;; replacement for b/uber:
(d/uber {:class-dir class-dir
:uber-file uber-file
:basis basis})
hf.depstar.api/uber
accepts :basis
, :class-dir
, :uber-file
, and :main
. It additionally accepts any of depstar
's options that can affect building an uberjar file, such as :exclude
, :manifest
, :repro
, :verbose
, etc.
The example above comes from the tools.build Guide.
Alternatively, you can use the hf.depstar
tasks instead:
jar
-- the complete (library) JAR building process, including optional pom.xml
creation/sync'ing, AOT compilation, etc,uberjar
-- the complete (application) uberjar building process, including optional pom.xml
creation/sync'ing, AOT compilation, etc,aot
-- perform AOT compilation (to a :target-dir
directory),pom
-- create/sync pom.xml
, optionally to a :target-dir
directory,build
-- generic JAR builder to be used with aot
and/or pom
.In this case, your build.clj
script will start like this:
(ns build
(:require [clojure.tools.build.api :as b]
[hf.depstar :as depstar]))
Then you can either use depstar/jar
or depstar/uberjar
with a parameter hash map containing any/all of the options that depstar
understands, or you can use depstar/aot
, depstar/pom
, and depstar/build
in a threaded combination, passing in the parameter hash map:
(defn jar [params]
(depstar/jar (merge {:jar "MyLib.jar"} params)))
(defn uber-1 [params]
(depstar/uberjar (merge {:jar "MyProject.jar"
:aot true
:main-class "project.core"
:sync-pom true}
params)))
(defn uber-2 [params]
;; ensure clean target directory:
(b/delete {:path "target"})
(-> (merge {:jar "MyProject.jar"
:aot true
:main-class "project.core"
:sync-pom true
:target-dir "target"}
params})
(depstar/aot)
(depstar/pom)
;; build requires this as well:
(assoc :jar-type :uber)
(depstar/build)))
When the aot
task is used, a :target-dir
must be provided so that build
knows where to find the freshly-compiled .class
files. When :target-dir
is provided, pom
will write pom.xml
into that directory, based on the source pom.xml
if present. See Target Directory for more details.
Can you improve this documentation?Edit on GitHub
cljdoc is a website building & hosting documentation for Clojure/Script libraries
× close