[2.x] fix: Runner should fail on JDK < 17 for sbt 2.x#8825
[2.x] fix: Runner should fail on JDK < 17 for sbt 2.x#8825eed3si9n merged 6 commits intosbt:developfrom
Conversation
**Problem** Running sbt 2.x with JDK 8 produces a confusing "server was not detected" error because the JDK version check only required JDK 8+ and only ran in the non-native-client path. **Solution** Move java_version detection before the native client decision and add checkJava17ForSbt2 that requires JDK 17+ when sbt major version >= 2. Fixes sbt#8813
Move JDK version check before native client decision in sbtw and require JDK 17+ when build.properties declares sbt 2.x.
Move checkjava before native client decision in sbt.bat and require JDK 17+ when build.properties declares sbt 2.x.
Extract JDK version check logic into Runner.minimumJdkVersion for testability. Add RunnerSpec with tests for sbt 1.x, 2.x, and 3.x version detection.
Manual test proof (before vs after)Before (develop branch) — JDK 8 + sbt 2.x:The After (this branch) — JDK 8 + sbt 2.x:The new After — JDK 17 + sbt 2.x (normal operation):After — JDK 8 + sbt 1.x (backward compatible):Note: JDK 8 is not installed on my test machine, so the bash function was tested by simulating |
|
FYI - we have fake |
The fake java script used by launcher integration tests reported JDK 8. Since sbt 2.x now requires JDK 17+, the citest2 (sbt 2.x) integration tests would fail with the new JDK version check.
52c79d7 to
800e9cb
Compare
Instead of silently ignoring --rt-ext-dir (which causes sbt.bat to mkdir on an empty string), properly simulate JDK 9+ behavior by creating a temp directory with java9-rt-ext- prefix and a dummy rt.jar inside it.
|
Happy Friday @eed3si9n |
**Problem** Running sbt 2.x with JDK 8 produces a confusing "server was not detected" error because the JDK version check only required JDK 8+ and only ran in the non-native-client path. **Solution** Move java_version detection before the native client decision and add checkJava17ForSbt2 that requires JDK 17+ when sbt major version >= 2. Fixes sbt#8813
**Problem** Running sbt 2.x with JDK 8 produces a confusing "server was not detected" error because the JDK version check only required JDK 8+ and only ran in the non-native-client path. **Solution** Move java_version detection before the native client decision and add checkJava17ForSbt2 that requires JDK 17+ when sbt major version >= 2. Fixes sbt#8813
**Problem** Running sbt 2.x with JDK 8 produces a confusing "server was not detected" error because the JDK version check only required JDK 8+ and only ran in the non-native-client path. **Solution** Move java_version detection before the native client decision and add checkJava17ForSbt2 that requires JDK 17+ when sbt major version >= 2. Fixes sbt#8813 * [2.x] fix: Fail early when sbt 2.x is run with JDK < 17 (sbtw) Move JDK version check before native client decision in sbtw and require JDK 17+ when build.properties declares sbt 2.x. * [2.x] fix: Fail early when sbt 2.x is run with JDK < 17 (sbt.bat) Move checkjava before native client decision in sbt.bat and require JDK 17+ when build.properties declares sbt 2.x. * [2.x] test: Add minimumJdkVersion helper and unit tests for sbtw Extract JDK version check logic into Runner.minimumJdkVersion for testability. Add RunnerSpec with tests for sbt 1.x, 2.x, and 3.x version detection. * [2.x] test: Bump fake java to JDK 17 for integration tests The fake java script used by launcher integration tests reported JDK 8. Since sbt 2.x now requires JDK 17+, the citest2 (sbt 2.x) integration tests would fail with the new JDK version check. * Simulate JDK 9+ rt.jar handling in fake java script Instead of silently ignoring --rt-ext-dir (which causes sbt.bat to mkdir on an empty string), properly simulate JDK 9+ behavior by creating a temp directory with java9-rt-ext- prefix and a dummy rt.jar inside it.
**Problem** Running sbt 2.x with JDK 8 produces a confusing "server was not detected" error because the JDK version check only required JDK 8+ and only ran in the non-native-client path. **Solution** Move java_version detection before the native client decision and add checkJava17ForSbt2 that requires JDK 17+ when sbt major version >= 2. Fixes #8813 * [2.x] fix: Fail early when sbt 2.x is run with JDK < 17 (sbtw) Move JDK version check before native client decision in sbtw and require JDK 17+ when build.properties declares sbt 2.x. * [2.x] fix: Fail early when sbt 2.x is run with JDK < 17 (sbt.bat) Move checkjava before native client decision in sbt.bat and require JDK 17+ when build.properties declares sbt 2.x. * [2.x] test: Add minimumJdkVersion helper and unit tests for sbtw Extract JDK version check logic into Runner.minimumJdkVersion for testability. Add RunnerSpec with tests for sbt 1.x, 2.x, and 3.x version detection. * [2.x] test: Bump fake java to JDK 17 for integration tests The fake java script used by launcher integration tests reported JDK 8. Since sbt 2.x now requires JDK 17+, the citest2 (sbt 2.x) integration tests would fail with the new JDK version check. * Simulate JDK 9+ rt.jar handling in fake java script Instead of silently ignoring --rt-ext-dir (which causes sbt.bat to mkdir on an empty string), properly simulate JDK 9+ behavior by creating a temp directory with java9-rt-ext- prefix and a dummy rt.jar inside it. Co-authored-by: Dream <[email protected]>
**Problem** Running sbt 2.x with JDK 8 produces a confusing "server was not detected" error because the JDK version check only required JDK 8+ and only ran in the non-native-client path. **Solution** Move java_version detection before the native client decision and add checkJava17ForSbt2 that requires JDK 17+ when sbt major version >= 2. Fixes #8813 Co-authored-by: Dream <[email protected]>
Fixes #8813
Summary
When sbt 2.x is run with JDK 8, the runner now prints a clear error message instead of the confusing "server was not detected" error.
Problem
Running
sbt -Dsbt.version=2.0.0-RC9with JDK 8 produces:This happens because for sbt 2.x,
isRunNativeClient()returns true by default, which skips the JDK version check entirely. The native client then fails with a confusing error.Solution
Detect the JDK version before the native client decision in all three runner entry points, and require JDK 17+ when sbt major version >= 2:
sbt): AddedcheckJava17ForSbt2()function, movedjava_versiondetection before the native client branchsbt.bat): Updated:checkjavato parse sbt version and require 17 for sbt 2.x, moved call before native client branchsbtw/Main.scala): ExtractedRunner.minimumJdkVersion()helper, moved JDK check beforeshouldRunNativeClientUsers now see:
Test results
Bash function test (7 cases, all pass):
sbtw unit tests (
sbt sbtwProj/test):Verification
sbt sbtwProj/compilepassessbt sbtwProj/test— 5/5 passsbt sbtwProj/scalafmtCheckpassescheckJava17ForSbt2tested manually — 7/7 cases pass