I’m beyond ecstatic to announce that JReleaser has finally posted its first release! JReleaser 0.1.0 is readily available, you can find more about this tool at https://jreleaser.org. So what is JReleaser? In just once sentence: the quick and effortless way to release your Java project! For 2 decades we have relied on Maven Central as the de facto place for publishing JARs, however options for publishing binary distributions (such as Zip and Tar) abound, often times tied with specific platforms such as Homebrew for Mac, Snapcraft for Linux, and Scoop for Windows, among others. JReleaser’s goal is to lower the entry barrier for publishing binaries using these packagers, and it offers a wide variety of options to fulfill said goal.
At the heart of JReleaser is its model, which defines the minimum metadata required for:
- creating, tagging, and publishing a release to popular Git services such as GitHub, GitLab, and Gitea.
- creating, packaging, and publishing platform specific packagers such as Homebrew, Snapcraft, Scoop, Chocolatey.
- creating and publishing Docker images.
- creating and publishing Jbang aliases and catalogs.
- announcing the release via Sdkman, Twitter, e-mail, and more.
All these capabilities can be invoked as a single command or in stages, depending on what you want to accomplish. Sometimes performing all steps in one swoop is best, thus
full-release would be the way to go. In some other cases you may be interested in just creating and tagging a release with no additional packagers involved, easily done by invoking
release. Other times your build pipeline already produces such releases but you’re interested in creating and publishing packagers, then
upload is the way to go. Or perhaps you only want to announce the release, in which case
announce has you covered.
JReleaser creates packagers based on file templates. These templates provide conventional defaults to get you stared quickly. However not all sizes fit all and there will be times when you may need to tweak the template. No problem, JReleaser lets you customize lots of things, such as including your own templates. Neat!
JReleaser may be invoked on the command line, or via its Maven and Gradle plugin, even via Ant tasks. JReleaser can also be used in CI, with a custom GitHub Action or downloaded directly into your CI pipeline using the CLI tool or the Mave/Gradle plugins.
Once again the goal of this tool is not to compete with existing tools in terms of publishing JARs to Maven Central or other Maven compatible repositories, but to enhance existing capabilities and let your project have a wider reach thanks to additional distributions channels.
I can not in good conscience announce JReleaser without acknowledging its origins:
jreleaser is the bees knees!
Here is how I recall its birth with @aalmiray:
me: I just automated installation of jbang from anywhere
a: oh, I just did it using goreleaser for gm.
me: I wish someone made releaser for java using jbang as inspiration
a: hold my beer! https://t.co/nbhVkN2uBX
— Max Rydahl Andersen (@maxandersen) March 28, 2021
Close to a year ago I took the plunge and decided to learn Go for real, as I wanted a tool that would let me invoke the soon-to-be-added-to-core Maven wrapper in a similar fashion as the Gradle wrapper is done via gdub. But I wanted a native binary instead of relying on shell scripts. There are a handful of options of course but I was looking for an excuse to get into Go, so that was it. The little tool is known as Gum (why does it matter). It became quite clear since the beginning that I had no clue about making a binary available to as many platforms as needed. The thought of just putting source code into a repository and have potential consumers build from source or figure it out was, to put it mildly, not appealing at all.
This is where GoReleaser came into play and it immediately blew me away with its ease of use. It’s just a delight to work with. All configuration is centralized in a single file. Package generation is driven by templates. Releases are tagged and automated. This is exactly what I needed. I must confess I threw up my arms in disbelief wishing something like it would exists for Java applications.
Months later, chatting with Max regarding his experiences with publishing Jbang to as many channels as he could, we soon found out I was not the only one frustrated by the lack of coherence and consistency for sorting out that feat. And so, taking Jbang’s build and GoReleaser as inspiration work on JReleaser began in earnest and now it’s a real thing. Feedback is always welcomed. Should you encounter any issues when trying it out or if you spot a missing feature, do let us know at https://github.com/jreleaser/jreleaser/issues.
FWIW if you have not tried Jbang already, what are you doing? Go, take it for a spin!
Keep on coding!