Jason Lee, on JReleaser

Jason Lee wrote a walkthrough of releasing a Java project with JReleaser. JReleaser is Andres Almiray's release automation tool, and it turns a full release process - all of it - into one Maven profile and one command.

The problem is, and has been for quite some time, that a release is not just mvn deploy. A release is signed artifacts, source and javadoc jars because Maven Central requires them, a Git tag, a changelog somebody has to write, publication to the repository, and then telling the world the thing exists. It's an error-prone totality, and the errors are public, and in Central's case they are permanent, because you cannot unpublish from Maven Central.

For most of two decades, the path to Central ran through Sonatype's OSSRH, and OSSRH was ... involved. You filed a ticket to claim your groupId and waited for a human to approve it. You generated GPG keys and learned which keyservers counted. You deployed to a staging repository, logged into the Nexus UI, and performed the close-and-release dance, hoping the validation rules agreed with your POM. It's easy to imagine a perfectly decent library not being published through official channels because the process cost more than the code did: it's trivial to publish to a custom repository and just expect users to use that instead.

But that era is over. Sonatype shut OSSRH down in 2025, along with the Nexus 2 it ran on, and the Central Publisher Portal replaced it. The old API survives only as a compatibility shim that emulates a subset of Nexus 2 for build tooling that has not caught up. Gradle and sbt publishers spent the first half of 2025 scrambling while plugin support chased the deadline. But it's getting better with stability.

Jason's configuration, all of it living in a Maven release profile, signs the artifacts, stages them locally, cuts a GitHub release with a conventional-commits changelog, publishes to Central through the Portal API, and publishes a JBang script besides. That last one deserves a moment: when the release completes, anyone can run his demo application with jbang jreleaser-demo@jasondlee. Not clone it, not build it. Run it.

One more detail worth your attention when you read him: the <stage>UPLOAD</stage> setting. JReleaser will happily publish to Central in one motion, but Jason configures it to upload and hold, so publication takes a deliberate click in the Central dashboard. Remember the permanence problem above, where every mistake is captured and set in stone? A manual gate in front of an irreversible step is cheap insurance, well worth the price of admission.

It's a good tool, and an excellent walkthrough.

Comments (0)

Sign in to comment

No comments yet.