[2.x] fix: Print server stderr on startup failure#8816
Merged
eed3si9n merged 1 commit intosbt:developfrom Feb 26, 2026
Merged
Conversation
**Problem** When the sbt server fails to start (e.g. wrong JDK version), the client only shows "failed to connect to server" hiding the actual error. The server stderr is redirected to /dev/null to prevent Linux pipe buffer deadlocks (sbt#8442), so diagnostic output is lost. **Solution** Redirect server stderr to a temp file instead of /dev/null. When the server fails to start (portfile never appears), read and print the temp file contents before throwing ServerFailedException. The temp file is cleaned up eagerly on both success and failure paths. Fixes sbt#8812
Contributor
Author
eed3si9n
reviewed
Feb 26, 2026
eed3si9n
approved these changes
Feb 26, 2026
eed3si9n
pushed a commit
to eed3si9n/sbt
that referenced
this pull request
Mar 1, 2026
**Problem** When the sbt server fails to start (e.g. wrong JDK version), the client only shows "failed to connect to server" hiding the actual error. The server stderr is redirected to /dev/null to prevent Linux pipe buffer deadlocks (sbt#8442), so diagnostic output is lost. **Solution** Redirect server stderr to a temp file instead of /dev/null. When the server fails to start (portfile never appears), read and print the temp file contents before throwing ServerFailedException. The temp file is cleaned up eagerly on both success and failure paths. Fixes sbt#8812
eed3si9n
added a commit
that referenced
this pull request
Mar 1, 2026
**Problem** When the sbt server fails to start (e.g. wrong JDK version), the client only shows "failed to connect to server" hiding the actual error. The server stderr is redirected to /dev/null to prevent Linux pipe buffer deadlocks (#8442), so diagnostic output is lost. **Solution** Redirect server stderr to a temp file instead of /dev/null. When the server fails to start (portfile never appears), read and print the temp file contents before throwing ServerFailedException. The temp file is cleaned up eagerly on both success and failure paths. Fixes #8812 Co-authored-by: Dream <[email protected]>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Fixes #8812
Summary
When the sbt server fails to start, print the actual error instead of only showing "failed to connect to server".
Problem
When the server process fails during auto-start (e.g. wrong JDK version producing
UnsupportedClassVersionError), the client only prints:This hides the real cause. The
--serverflag shows the error because it usesinheritIO(), but the auto-start path redirects stderr to/dev/null(added in #8442 to prevent Linux pipe buffer deadlocks).Solution
Redirect server stderr to a temp file instead of
/dev/null. If the server fails to start (portfile never appears), read and print the temp file contents before throwingServerFailedException. This preserves the #8442 fix (writing to a file avoids pipe buffer deadlocks) while capturing startup errors for diagnostics.The temp file is cleaned up eagerly on both success and failure paths, with
deleteOnExit()as a safety net.Changes
main-command/.../NetworkClient.scala/dev/nullServerFailedException