Example code for how to create a single binary CLI in Java.
Java Shell
Switch branches/tags
Nothing to show
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Failed to load latest commit information.
src
.gitignore
README.md
build-and-run.sh
pom.xml

README.md

This is an example project to test and demonstrate how to create self contained (single binary) CLI in Java.

I know, I know. Why Java? Well, a lot of people that don't, but definitely should write CLIs have Java as their primary language. They should write CLIs to make their life easier. It's time to stop with all the Maven/Gradle/Whatever plugins that shoehorns functionality that have nothing to do with builds and releases into it.

In additiion:

  • People seems more used to writing tests in Java. Yes, you should have automated tests for your CLI.
  • You can create single distributable binary
  • It's cross platform
  • It starts up much faster than I feared. ;)

You can do it. Just write a CLI. ;)

These are of course traits you can find other places, but I really wanted to make it easy in Java too. ;)

Requirements

To build/test this project you'll need:

  • JDK (8 and above)
  • Maven

Running the resulting code requires a JRE installed.

What's used

There are other libraries used as well, but they are only for demo purposes.

NOTE: The Shade plugin might get you into problems with some libraries. A friend of mine pointed me in the direction of Capsule which looks promising. You might want to look into that if Shade gives you problmems. There are some minor drawbacks to how it does stuff, but I'll certainly keep it at hand.

Distribution of the binary

Hopefully you release your binaries from Maven to some kind of repository. That makes it available over HTTP so I usually do something like:

curl http://myrepo/org/my/group/artifact/version/artifact-version.jar > ~/bin/mycli && chmod u+x ~/bin/mycli

Awesomeness with completion

Since DocOpt is a machine readable format you can even generate Bash completion for your command automatically. Have a look at this link to see how: https://github.com/Infinidat/infi.docopt_completion

Testing

NOTE: As this is Java you'll of course need a JRE installed. Nothing will work witout it. :)

You can build and run locally (requires all the usual Maven, JDK things):

mvn clean install && ./target/executable-json-util-1.0-SNAPSHOT.jar

Or you test it easily like this (just need the JRE):

curl https://dl.dropboxusercontent.com/u/122923/executable-json-util-1.0-SNAPSHOT.jar > ~/bin/json-util && chmod u+x ~/bin/json-util
~/bin/json-util

You probably shouldn't download random binaries off the internet and run them, but if you like to you can. :)