Learn how to make a native Clojure CLI with GraalVM native-image and SCI!
This example is set up around an example CLI, jayfu
, that reads JSON from
stdin and transforms it using a function which is dynamically evaluated:
$ echo '{"a": {"b": 2}}' | ./jayfu -f '#(-> % :a :b)' -k keyword
2
See this talk which guides you through this project.
Download GraalVM. Just download it to your Downloads folder and unzip the archive. No further installation required. This tutorial is based on version 21.1.0 JDK11.
Set the GRAALVM_HOME
environment variable. E.g.:
export GRAALVM_HOME=/Users/borkdude/Downloads/graalvm-ce-java11-21.1.0/Contents/Home
To run with Clojure or Java, you will need to have a Java 8 or 11 installation available. You can also use the downloaded GraalVM for this.
Install babashka (0.4.1 or higher).
Always use cmd.exe
for executing GraalVM compilation, do not use PowerShell.
On Windows, install Visual Studio 2017 or 2019 and in cmd.exe
load:
"C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Auxiliary\Build\vcvars64.bat"
This will set the right environment variables for GraalVM.
After this you should be able to run bb native-image
.
To see all available tasks in this project, run bb tasks
:
$ bb tasks
The following tasks are available:
run-main Run main
uberjar Builds uberjar
run-uber Run uberjar
graalvm Checks GRAALVM_HOME env var
native-image Builds native image
To run this example using Clojure, run:
$ bb run-main --help
Usage:
-f, --func FUNCTION identity The function applied to JSON from stdin
-k, --key-fn KEY-FN identity The function applied to keywords
-h, --help
$ echo '{"a": {"b": 2}}' | bb run-main -f '#(-> % :a :b)' -k keyword
2
To build the native image, run:
$ bb native-image
This should produce a binary called jayfu
:
$ echo '{"a": {"b": 2}}' | ./jayfu -f '#(-> % :a :b)' -k keyword
2
See this talk which guides you through this project.
Coming soon.
Copyright © 2021 Michiel Borkent
Distributed under the EPL License. See LICENSE.