For perspective, I see this as part of a broader shift happening in the JVM world where Java 8 and 11 are finally dying and 17+ is the new normal now. We already published a pretty long list of prominent JVM-based projects that have dropped support for 8 and/or 11 at Next Scala 3 LTS series will increase minimum required JDK version | The Scala Programming Language (Spring, Hibernate, Jetty, Spark 4…). In short, this is the new world: move to JDK 17+ or resign yourself to using old software indefinitely.
we plan to keep sbt 1.x under minimum maintenance for a while to address security vulnerabilities etc
That’s very good, because it means that anyone who has already a working sbt 1 build on JDK 8 or 11 will be free to simply keep using sbt 1, leaving sbt 2 free to make this jump forward.
And now I’d like to make my main argument for making this change now:
sbt 2’s lifecycle is likely to be very, very long — a decade or so, perhaps. (Consider how long sbt 1’s lifecycle was!)
And very importantly, Scala 3.7 lazy vals don’t work on JDK 26+. So in order to support JDK 26+, sbt needs to be on Scala 3.8+ (preferably 3.9 LTS), which forces dropping 8 and 11.
sbt 2 is already a “burn the forest” upgrade, meaning that the entire plugin ecosystem needs to ported and re-published and everyone needs to port their build definitions, too.
Keeping JDK 8/11 support for that entire lifecycle could be quite limiting.
And if we don’t drop 8 and 11 now, dropping them later would result in an unnecessary second (smaller, but still significant) forest fire where in order to support JDK 26+, the entire plugin ecosystem will need to be re-published a second time.
A single forest fire, burn once and be done, seems strongly preferable to me.
This isn’t only about the labor required for plugin authors. (Authors who, as always in F/OSS, are prone to going AWOL, creating ecosystem-wide delays and confusion.)
It’s also just about setting clear expectations for users. If we drop 8 and 11 now, in the initial sbt 2 release, we move all at once to a new state that is clear and easy for everyone to understand. Either a plugin is available for sbt 2 or it isn’t, and if it is available, it will continue to work on all supported JDKs for the entire sbt 2 lifecycle. Whereas if we have this second fire later, we will be creating a more complicated and confusing situation for everyone.