A POM by any other name

By POM I mean Apache Maven’s Project Object Model. The POM format is widely used not just by Apache Maven to build and consume projects, but also by other tools such as IDEs, build tools, code analyzers, etc. Understanding the capabilities exposed by this format are key to successful builds, developer productivity, supply chain management (and security as well), and other concerns. What follows is a list of different types of POMs you may encounter in the wild. This list is not exhaustive, feel free to comment on other patterns you may find. To begin with, a pom.xml file is Read More


Crafting rolling releases for a Quarkus CLI application

I’ve been working on a tool called JReleaser for sometime now. JReleaser shortens the distance between your binaries and potential consumers by packaging and publishing said binaries using formats and tools that consumers enjoy, such as Homebrew, Scoop, Docker, etc. All kind of Java (and since v0.5.0 also non-Java) applications are supported, this being said CLI applications are ideal. There are many ways to build CLI applications with Java, it so happens that Quarkus is one of them. I’ve been looking for an excuse to setup a Quarkus project to try out JReleaser with it, little did I know that Read More


JReleaser says hello!

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 Read More


Revisiting Publication to Maven Central with Apache Maven

Some weeks ago I posted an entry on Publishing to Maven Central with Apache Maven which shows the configuration I put in place on a handful of Open Source projects I maintain. The trigger that starts a release workflow is a commit message with “[release]” as a prefix. I was quite happy with the results, after all I’ve got the whole release pipeline working on automatic, however two things were nagging me. Firstly that a release workflow would always require a commit. What if I just wanted to publish a release on the go? Add up pushing a release from Read More


PomChecker 1.1.0 has been released!

I’m happy to announce the immediate availability of the PomChecker suite version 1.1.0! PomChecker is a small utility that can verify if a POM or BOM file complies with the minimum requirements for being uploaded to Maven Central. I wrote this utility to reduce the chance of getting an error when uploading artifacts to Maven Central due to invalid or missing information in a given POM. There are no changes in behavior compared to version 1.0.0 however there are now three more options at your disposal for checking the validity of a POM file. The new options include: Running as Read More


Publishing to Maven Central using Apache Maven

Last week JFrog announced changes to its Bintray & JCenter services which will eventually lead to these services being discontinued by February 2022. I’ve been a happy Bintray user since the early days. Their services make uploading archives and having them available to the public a snap. Syncing those artifacts from JCenter to Maven Central can also be automated, simplifying the full release process. Previously I blogged about the options available to Gradle projects for publishing to Maven Central via Bintray. I’m saddened by the recent news of Bintray riding into the sunset, I’ll miss it dearly. And like many Read More


Maven: verify or clean install?

This is it. After months of tweeting memes about mvn clean install I decided to get some numbers to see how performance would be affected when switching from one command to the other. But first a bit of history. Like many developers when faced with building a Maven project the first reaction is to invoke mvn clean install, after all you find that instruction in almost every README or BUILD file, so why question it? It does not matter if the project is single or contains multiple modules, the instruction is the same. As a matter of fact when the Read More


Gradle POMs revisited

Close to two years ago I posted my thoughts on introducing a Maven-like structure for organizing and building Gradle projects. I dubbed those ramblings The Gradle POM and The Gradle SuperPOM. In truth the latter is a misnomer, instead it should had been “The Gradle Parent POM”. These posts served as an introduction to a new project I had been working on: the Kordamp Gradle Plugin suite. The original goal for this project was to bring order to chaos found in the dozens of Open Source projects I actively maintain. Before Kordamp began, all these projects relied on the tried Read More


Maven features I wish Gradle had: inlined plugins

Since the early days of Maven the development team recognized that they couldn’t (and shouldn’t) provide a solution for every problem we as consumers may face with our builds. In order to cater for our every whim and emerging requirements the Maven build tool added a pluggable mechanism to provide behavior as needed, and thus Maven plugins were born. Maven plugins are typically configured inside a <build> block found in the pom.xml file, which lets them contribute goals that may bind to lifecycle phases by default, or just providing goals that you can invoke at any time. But what if Read More


Gum 0.8.0 is out!

Whoa, 2 Gum releases in the same month? I’m having so much fun working with and on Gum that I just couldn’t resist posting another release. Last time I mentioned that Gum is capable of launching JBang with explicit and implicit targets; in the case of implicit a strict file order was to be followed: .java, .jsh, and .jar. Well no more, Gum 0.8.0 let’s you configure the resolution order as you deem necessary. The configuration may be per directory (project) or global. Which brings me to the second major feature added to this release, how do you know which Read More


ˆ Back To Top