Discussion about this post

User's avatar
Ron's avatar

I think what's confusing to many, yourself included it seems, is not so much LTS but rather the way versions are named. So let's ignore version names for a moment, and see what's changed.

For many years, at least since JDK 7, every 6 months there was a feature release (back then they were called "limited update" releases) containing large new features and significant changes to the runtime. Java users had no choice but to upgrade to those new feature releases because the old feature releases were abandoned and received no security patches. Because these feature releases were occasionally disruptive, this caused problems to those people who just wanted to get security patches.

So change number one was the introduction of LTS, which, for the first time allowed Java users who wanted just security patches to stay on old feature versions and just get patches without being forced to upgrade to a new feature release every six months.

The other problem was that while feature releases could and often did make drastic changes to the runtime, they could not make any additions to the spec. That means that overhauling the JIT compiler or the GC algorithms (or adding a whole new UI toolkit as long as it wasn't made part of the SE spec) were done in those feature releases, they couldn't so much as add a new method to the ArrayList class, as that meant changing the spec. Changes to the spec were only allowed in "major releases", which, as you correctly note, were irregular and far between.

So change number two was doing away with major releases altogether and removing the restriction that the semi-annual feature releases could not change the spec. This meant that, in addition to 50KLOC of internal changes, feature releases could now a method to ArrayList.[1]

Yet another problem -- the most superficial one -- was how versions were named. 7u1 and 7u3 were patch updates, but 7u2 and 7u4 were big feature releases (and again, people had no choice but to upgrade their JDK from 7u2 to 7u4 because the feature version 7u2 stopped getting patches once the new feature version, 7u4, came out). To make matters worse, the version naming scheme was changed in 8, where the big feature releases were named 8u20 and 8u40 (again, 8u20 was abandoned when 8u40 was released), while patch releases were named something like 8u25.

So change number 3 was to make the version names more meaningful, and with major releases gone this was easy: feature releases would get integer names, while patches would get dot names. The version that would have been named 9u20 was, instead, named 10. This most superficial change that was meant to make it easier for people to understand what's included in the release, unfortunately confused people the most. Some companies stopped making the very same upgrades they'd made for many years (because they had no choice) and relied on the LTS service for patches even when it would have been easier, cheaper, safer, and more productive for them to continue upgrading feature releases as they'd done before.

[1]: But did this make the feature release upgrades harder than before? Maybe a little, but not for long. After JDK internals were encapsulated in JDK 16, those who regularly update feature releases report the process easier than for the feature releases in the JDK 8u and 7u era. This isn't so much because feature updates are perfect, but largely because they were particularly problematic in the past, which is why introducing LTS so that, for the first time ever, those who really don't want or need new features or performance enhancements wouldn't have to upgrade.

Expand full comment
Bioshark's avatar

Regarding LTS, well put! I totally agree with your logic. We are developers, not lawyers. I'm pretty sure we won't reach java versions 50, 75 or 100, because I have a feeling they'll change release cadence and/or versioning in a few years.

P.S. Still, Java is a great language and I wouldn't want to ditch it.

Expand full comment
9 more comments...

No posts