[1.x] fix: Runner should fail on JDK < 17 for sbt 2.x (#8825) (#8854)

**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 <42954461+eureka928@users.noreply.github.com>
This commit is contained in:
eugene yokota 2026-03-01 05:30:13 -05:00 committed by GitHub
parent c88b641c36
commit ec0d181abe
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 53 additions and 5 deletions

View File

@ -1,9 +1,28 @@
#!/usr/bin/env python3
import os
import sys
import tempfile
if '--version' in sys.argv or '-version' in sys.argv:
print('openjdk version "1.8.0_212"')
print('openjdk version "17.0.12" 2024-07-16')
elif '--rt-ext-dir' in sys.argv:
# Simulate JDK 9+ rt.jar ext dir: output a directory path containing
# "java9-rt-ext-" that the launcher scripts look for via grep/findstr.
ext_dir = os.path.join(tempfile.gettempdir(), 'java9-rt-ext-fake')
os.makedirs(ext_dir, exist_ok=True)
# Create a dummy rt.jar so the launcher won't try to --export-rt
rt_jar = os.path.join(ext_dir, 'rt.jar')
if not os.path.exists(rt_jar):
open(rt_jar, 'w').close()
print(ext_dir)
elif '--export-rt' in sys.argv:
# Simulate rt.jar export: create the file at the specified path
idx = sys.argv.index('--export-rt')
if idx + 1 < len(sys.argv):
rt_path = sys.argv[idx + 1]
os.makedirs(os.path.dirname(rt_path), exist_ok=True)
open(rt_path, 'w').close()
else:
for arg in sys.argv[1:]:
print(repr(arg)[1:-1])

View File

@ -617,13 +617,13 @@ if !sbt_args_print_sbt_script_version! equ 1 (
goto :eof
)
call :checkjava
if !run_native_client! equ 1 if not defined sbt_args_print_version (
goto :runnative !SBT_ARGS!
goto :eof
)
call :checkjava
if defined sbt_args_sbt_jar (
set "sbt_jar=!sbt_args_sbt_jar!"
) else (
@ -1006,9 +1006,24 @@ exit /B 0
:checkjava
set /a required_version=8
rem sbt 2.x requires JDK 17+
set "_sbt_check_ver=!build_props_sbt_version!"
if not defined _sbt_check_ver set "_sbt_check_ver=!init_sbt_version!"
if defined _sbt_check_ver (
for /F "delims=.-_ tokens=1" %%m in ("!_sbt_check_ver!") do (
if %%m GEQ 2 set /a required_version=17
)
)
set "_sbt_check_ver="
if /I !JAVA_VERSION! GEQ !required_version! (
exit /B 0
)
if !required_version! GEQ 17 (
>&2 echo.
>&2 echo [error] sbt 2.x requires JDK 17 or above, but you have JDK !JAVA_VERSION!
>&2 echo.
exit /B 1
)
>&2 echo.
>&2 echo The Java Development Kit ^(JDK^) installation you have is not up to date.
>&2 echo sbt requires at least version !required_version!+, you have

18
sbt
View File

@ -500,6 +500,18 @@ checkJava() {
fi
}
# sbt 2.x requires JDK 17+
checkJava17ForSbt2() {
local sbtV="$build_props_sbt_version"
[[ "$sbtV" == "" ]] && sbtV="$init_sbt_version"
[[ "$sbtV" == "" ]] && return
local sbtMajor=$(echo "$sbtV" | sed 's/^\([0-9]*\).*/\1/')
if (( sbtMajor >= 2 )) && [[ "$java_version" != "no_java" ]] && (( java_version < 17 )); then
echoerr "[error] sbt 2.x requires JDK 17 or above, but you have JDK $java_version"
exit 1
fi
}
copyRt() {
local at_least_9="$(expr $java_version ">=" 9)"
if [[ "$at_least_9" == "1" ]]; then
@ -906,13 +918,15 @@ if [[ $print_sbt_script_version ]]; then
exit 0
fi
java_version="$(jdk_version)"
vlog "[process_args] java_version = '$java_version'"
checkJava17ForSbt2
if [[ "$(isRunNativeClient)" == "true" ]] && [[ -z "$print_version" ]]; then
set -- "${residual_args[@]}"
argumentCount=$#
runNativeClient
else
java_version="$(jdk_version)"
vlog "[process_args] java_version = '$java_version'"
addDefaultMemory
addSbtScriptProperty
addJdkWorkaround