Earlier this year I posted about a small utility called
A utilitiy that lets you get started working with java with zero friction and just run your code as-is.
A few things happened since then over a few late nights -
jbang is now available to run "everywhere" and
I found and saw more and more interesting things to apply jbang to.
jbang is now available to install and run in the following distributions:
The most obvious "missing" piece is a native Debian package for Debian/Ubuntu based distributions. If anyone reading this
knows how to make that happen and would like to contribute do please reach out!
Beyond that I consider it a pretty good start after a month.
As I got used to having
jbang available and could literally script anything I started to look for areas to apply
A few notable ones are highlighted below.
If you have
Mini web server apps
jbang got a good set of mini web server apps added.
Easy bug reporting
Early on I realized that with
jbang you now only need a single file or even just a code snippet marked up with
to report an issue with runnable code.
I did exactly that for https://github.com/github-api/github-api/issues/708 and I will do that more often now.
It is also now possible to implement
kubectl plugins in pure java.
Meaning you can do:
kubectl example pod list
example is a plugin available under the name
kubectl-example. Something not normally
possible with Java; but with Jbang you can.
You can see how its implemented at https://github.com/maxandersen/k8s-cli-java.
One thing to remember that since
jbang takes care of compiling and packaging when you run
there is zero need for
build.gradle files, maven or gradle wrapper nor extra layer of directories.
To see what a difference that makes try and compare to the original version
by codementor which inspired me to enable
jbang for plugin writing.
├── README.md ├── build.gradle ├── gradle │ └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat └── src └── main └── java └── com └── d2iq └── kubectl ├── ExampleCommand.java ├── Main.java ├── PodAddCommand.java ├── PodCommand.java ├── PodList2Command.java ├── PodListCommand.java └── ResourcesCommand.java 8 directories, 13 files
. ├── README.md └── kubectl-example 0 directories, 2 files
Quite a difference in visual and technical complexity if you ask me.
The simplicity and no need for setting up a lot of scaffolding was also which made me
quickly prototype a
smee-client in java. smee.io is webproxy used for
channeling external webhook events to your local host. Now there is one in Java, available
https://github.com/maxandersen/jbang-action/ which is a trivial Git hub action that lets
your write single file java scripting code and hook it into your workflow.
I’ve used it to implement a GitHub action that automatically mark pull-requests and issues based on what folder they references.
You can see that repo at https://github.com/maxandersen/jbang-issuelabeler.
Web testing/screenscraping with Selenium
A very recent addition with thanks to Aaron Walker, is the example of using Selenium.
By a simple maven dependency you are up and running with full access to selenium API’s letting
you take screenshots and introspect all the data on the website.
I can see myself do a few boring task automations with this down the line.
Highend desktop graphics and UI with JavaFX
I always wanted
jbang be able to launch JavaFX as historically I always struggled using it - especially with how its handled
after introduction of Java Modules. Well, as luck has it you can now just do:
With the help of openjfx and Gluon who made the JavaFX native libraries available from maven central we can
and it will download the proper JavaFX native binaries, launch it and you get to see a nice demo based on HanSolo’s TilesFX library.
Mind you, this works for both Java 8 (non-java modules) and Java 9+ (java modules).
I could go on but this blog been sitting in my outbox for too long so if you want see more examples take a look in https://github.com/maxandersen/jbang/tree/master/examples.
Whats next ?
Last night I released
jbang 0.20 which adds custom maven repository support.
In the upcoming releases I want to add support for multiple files to allow for better reuse between scripts/apps and possibly
have a native option to have the build be slower but make a native binary available.