[2.x] fix: restore CLI precedence over .sbtopts

According to the issue, `.sbtopts` entries are appended after
CLI args in sbt 1.12.x, so `.sbtopts` JVM memory settings (e.g., `-Xmx2g`) override CLI `--mem`,
causing invalid JVM settings.
This commit is contained in:
Pluto 2026-02-05 17:04:55 -06:00 committed by GitHub
parent 949c3ab04f
commit 12deebba2b
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 33 additions and 4 deletions

View File

@ -194,6 +194,29 @@ object RunnerScriptTest extends verify.BasicTestSuite with ShellScriptUtil:
s"Machine config should appear before project config. machineIndex=$machineIndex, projectIndex=$projectIndex" s"Machine config should appear before project config. machineIndex=$machineIndex, projectIndex=$projectIndex"
) )
testOutput(
"command line options override project .sbtopts",
sbtOptsFileContents =
"-J-Xmx2g\n-J-XX:ReservedCodeCacheSize=1g\n-J-XX:MaxMetaspaceSize=2g\n-J-Xss512m\n-J-XX:+UseG1GC"
)("-d", "-v", "-mem", "12288"): (out: List[String]) =>
if (isWindows) cancel("Test not supported on windows")
else
val cmdLineStart = out.indexWhere(_.contains("Executing command line"))
assert(cmdLineStart >= 0, "Command line section not found")
val cmdLine = out.drop(cmdLineStart + 1).takeWhile(!_.trim.isEmpty)
val xmxCliIndex = cmdLine.indexWhere(_.contains("-Xmx12288m"))
val xmxSbtoptsIndex = cmdLine.indexWhere(_.contains("-Xmx2g"))
val g1Index = cmdLine.indexWhere(_.contains("-XX:+UseG1GC"))
assert(xmxCliIndex >= 0, "CLI memory setting not found in command line")
assert(xmxSbtoptsIndex < 0, "sbtopts -Xmx2g should be overridden by CLI")
assert(g1Index >= 0, "sbtopts non-memory option not found in command line")
assert(
g1Index < xmxCliIndex,
s"sbtopts options should appear before CLI memory settings. g1Index=$g1Index, xmxCliIndex=$xmxCliIndex"
)
// Test for issue #7289: Special characters in .jvmopts should not cause shell expansion // Test for issue #7289: Special characters in .jvmopts should not cause shell expansion
testOutput( testOutput(
"sbt with special characters in .jvmopts (pipes, wildcards, ampersands)", "sbt with special characters in .jvmopts (pipes, wildcards, ampersands)",

14
sbt
View File

@ -859,17 +859,23 @@ runNativeClient() {
original_args=("$@") original_args=("$@")
sbt_file_opts=()
# Pull in the machine-wide settings configuration. # Pull in the machine-wide settings configuration.
if [[ -f "$machine_sbt_opts_file" ]]; then if [[ -f "$machine_sbt_opts_file" ]]; then
set -- "$@" $(loadConfigFile "$machine_sbt_opts_file") sbt_file_opts+=($(loadConfigFile "$machine_sbt_opts_file"))
else else
# Otherwise pull in the default settings configuration. # Otherwise pull in the default settings configuration.
[[ -f "$dist_sbt_opts_file" ]] && set -- "$@" $(loadConfigFile "$dist_sbt_opts_file") [[ -f "$dist_sbt_opts_file" ]] && sbt_file_opts+=($(loadConfigFile "$dist_sbt_opts_file"))
fi fi
# Pull in the project-level config file, if it exists (highest priority, overrides machine/dist). # Pull in the project-level config file, if it exists (highest priority, overrides machine/dist).
# Append so it appears last in command line and wins for duplicate properties. [[ -f "$sbt_opts_file" ]] && sbt_file_opts+=($(loadConfigFile "$sbt_opts_file"))
[[ -f "$sbt_opts_file" ]] && set -- "$@" $(loadConfigFile "$sbt_opts_file")
# Prepend sbtopts so command line args appear last and win for duplicate properties.
if (( ${#sbt_file_opts[@]} > 0 )); then
set -- "${sbt_file_opts[@]}" "$@"
fi
# Pull in the project-level java config, if it exists. # Pull in the project-level java config, if it exists.
[[ -f ".jvmopts" ]] && export JAVA_OPTS="$JAVA_OPTS $(loadConfigFile .jvmopts)" [[ -f ".jvmopts" ]] && export JAVA_OPTS="$JAVA_OPTS $(loadConfigFile .jvmopts)"