a clj-based uberjarrer (forked from healthfinch/depstar and enhanced)
Install this tool to an alias in $PROJECT/deps.edn
or $HOME/.clojure/deps.edn
:
{
:aliases {:depstar
{:extra-deps
{seancorfield/depstar {:mvn/version "0.4.1"}}}}
}
Create an uberjar by invoking depstar
with the desired jar name:
clojure -A:depstar -m hf.depstar.uberjar MyProject.jar
Create a (library) jar by invoking depstar
with the desired jar name:
clojure -A:depstar -m hf.depstar.jar MyLib.jar
If you want to see all of the files that are being copied into the JAR file, add -v
or --verbose
after the JAR filename.
depstar
uses the classpath computed by clojure
.
For example, add web assets into an uberjar by including an alias in your deps.edn
:
{:paths ["src"]
:aliases {:webassets {:extra-paths ["public-html"]}}}
Then invoke depstar
with the chosen aliases:
clojure -A:depstar:webassets -m hf.depstar.uberjar MyProject.jar
If there is a pom.xml
file in the current directory, depstar
will attempt to read it and figure out the group ID, artifact ID, and version of the project. It will use that information to generate pom.properties
and MANIFEST.MF
in the JAR file, as well as copying that pom.xml
file into the JAR file. If you are building an uberjar, the manifest will declare clojure.main
as the Main-Class
(otherwise that property will be omitted -- see also the -m
/ --main
option below).
You can suppress the consumption of the pom.xml
file with the -n
/ --no-pom
option.
Note that depstar
does no AOT compilation by default.
If you build an uberjar, you can run the resulting file as follows:
java -cp MyProject.jar clojure.main -m project.core
If you build an uberjar with a pom.xml
file present and do not specify -n
/ --no-pom
, so that a manifest is included, you can run the resulting file as follows:
java -jar MyProject.jar -m project.core
Finally, if you have a pom.xml
file and also include a (compiled) class in your JAR file that contains a main
function, you can use the -m
/ --main
option to specify the name of that class as the Main-Class
in the manifest instead of the default (clojure.main
):
# compile your main class onto your classpath somehow (see below)
# then build your uberjar:
clojure -A:depstar -m hf.depstar.uberjar MyProject.jar -m my.EntryPoint
# now you can run it like this:
java -jar MyProject.jar
# that will run my.EntryPoint's main function
As of 0.4.0, depstar
supports an AOT mode for uberjars via the -C
/ --compile
option. You must ensure that the classes
folder exists in your project directory and that it is on the classpath. Whilst you must do the former manually, you can automate the latter by adding an alias to your deps.edn
file like this:
{
:aliases {:uberjar
{:extra-paths ["classes"]
:extra-deps {seancorfield/depstar {:mvn/version "0.4.1"}}
:main-opts ["-m" "hf.depstar.uberjar" "MyProject.jar"
"-C" "-m" "my.main.ns"]}}
}
This will add classes
and depstar
to your classpath and then run depstar
to create an uberjar called MyProject.jar
, by compiling the my.main.ns
namespace (into classes
, along with any transitive dependencies), and specifying Main-Class: my.main.ns
in the manifest.
java -jar MyProject.jar
After you've generated your uberjar as above with a pom.xml
file, you can use the mvn
command below to deploy to Clojars (or other Maven-like repositories).
mvn deploy:deploy-file -Dfile=MyProject.jar -DpomFile=pom.xml -DrepositoryId=clojars -Durl=https://clojars.org/repo/
This assumes that you have credentials for your chosen repository in your ~/.m2/settings.xml
file. It should look like this (with your username and password):
<settings>
<servers>
<server>
<id>clojars</id>
<username>someperson</username>
<password>topsecret</password>
</server>
</servers>
</settings>
If you only want to install the artifact locally (for use in local development, similar to lein install
), you can use the following mvn
command:
mvn install:install-file -Dfile=MyProject.jar -DpomFile=pom.xml
After that you can require the dependency coordinates as usual, using the group ID, artifact ID, and version that you had setup in the pom.xml
file.
.keep
files.-C
/ --compile
option to AOT-compile the main namespace for an uberjar.clojure.xml
to extract group ID, artifact ID, and version.:unknown
copy handler and checking for excluded filenames in it; an unknown file type is now ignored, with a warning printed if it is not an excluded filename.-m
/ --main
option to override Main-Class
in the manifest.pom.xml
, if present, to generate a manifest (and copy pom.xml
into the JAR file).depstar
can be used to build JARs for older projects.-v
/--verbose
option to display files added to the archive; Fix #9 properly by creating parent directories prior to move of JAR file.*.pom
files; Fix #7 by excluding module-info.class
files; lists excluded files if debugging enabled.data_readers.clj
(do not close input stream!); supports -Ddepstar.debug=true
and DEPSTAR_DEBUG=true
to be more verbose.data_readers.clj
; hf.depstar.jar
namespace added.The use and distribution terms for this software are covered by the Eclipse Public License 2.0
Can you improve this documentation? These fine people already did:
Sean Corfield, Ghadi Shayban, Quest Yarbrough, Gert Goet & ⅅ₳ℕⅈⅇℒℒⅇ ҜⅇℱℱʘℝⅅEdit on GitHub
cljdoc is a website building & hosting documentation for Clojure/Script libraries
× close