Summary
In 5.3.0.RELEASE, every RemoteBootAppData parsed from the boot-java.remote-apps
setting has manualConnection forced to true before it reaches
SpringProcessConnectorRemote.updateApps. The user's own manualConnect value is
deserialised and then overwritten, so declaring a remote app no longer connects it —
and there is no setting that restores the previous behaviour.
In 5.2.0.RELEASE a declared app connects on its own.
Where
BootLanguageServerBootApp.lambda$remoteAppsFromSettingsConnector$0 gained a loop
over the parsed array:
aload 6
iconst_1
invokevirtual // Method …SpringProcessConnectorRemote$RemoteBootAppData.setManualConnection:(Z)V
iconst_1 — unconditional, after deserialisation, before updateApps. For
comparison, updateApps itself is byte-identical between the two releases, and
connectProcess differs only by a new null-jmxurl branch into
connectLocalProcessByPid.
RemoteBootAppData.manualConnect still exists and is still populated from the
settings JSON in 5.3.0.RELEASE, which is what makes this look like an oversight
rather than an intended API change: the field is read and then discarded.
Reproduction
Driven with a minimal LSP client over stdio against the released server jars —
no VS Code, no other IDE client — so nothing here depends on a particular
front-end.
-
Start any Boot application with the Actuator HTTP endpoints exposed
(management.endpoints.web.exposure.include=*), reachable at
http://localhost:8080/actuator.
-
initialize the language server, then send workspace/didChangeConfiguration
with:
{ "boot-java": { "remote-apps": [ { "jmxurl": "http://localhost:8080/actuator" } ] } }
-
Wait, then call sts/livedata/listConnected.
|
5.2.0.RELEASE |
5.3.0.RELEASE |
listConnected after declaring |
1 entry |
0 entries |
listProcesses for the declared app |
2 entries (refresh, disconnect) |
1 entry (connect) |
same, with "manualConnect": false written explicitly |
— |
still 0 entries |
The wait is not the variable: 5.3.0.RELEASE is still unconnected after 150 s,
while 5.2.0.RELEASE connects within the same window.
Everything after an explicit connect is unchanged on both releases —
sts/liveprocess/connected with type: "remote" and processKey equal to the
declared jmxurl, sts/livedata/get returning 409 beans and 30 mappings,
sts/livedata/getLoggers answering, and clearing the array to [] publishing
sts/liveprocess/disconnected. Only the automatic attach is affected.
Expected
Either manualConnect from the settings entry is honoured (it is still read), or
the field is removed and the new behaviour documented. Right now a client can set
it, the server stores it, and the value never takes effect.
Environment
- Spring Tools
5.3.0.RELEASE (spring-boot-language-server-2.3.0-SNAPSHOT-exec.jar)
vs 5.2.0.RELEASE (spring-boot-language-server-2.2.0-SNAPSHOT-exec.jar), both
from the official GitHub release VSIX
- macOS 26.5.2 arm64, Eclipse Temurin JDK 21.0.11
- Target: Spring Boot 3.5.5 over Actuator HTTP
Summary
In
5.3.0.RELEASE, everyRemoteBootAppDataparsed from theboot-java.remote-appssetting has
manualConnectionforced totruebefore it reachesSpringProcessConnectorRemote.updateApps. The user's ownmanualConnectvalue isdeserialised and then overwritten, so declaring a remote app no longer connects it —
and there is no setting that restores the previous behaviour.
In
5.2.0.RELEASEa declared app connects on its own.Where
BootLanguageServerBootApp.lambda$remoteAppsFromSettingsConnector$0gained a loopover the parsed array:
iconst_1— unconditional, after deserialisation, beforeupdateApps. Forcomparison,
updateAppsitself is byte-identical between the two releases, andconnectProcessdiffers only by a new null-jmxurlbranch intoconnectLocalProcessByPid.RemoteBootAppData.manualConnectstill exists and is still populated from thesettings JSON in
5.3.0.RELEASE, which is what makes this look like an oversightrather than an intended API change: the field is read and then discarded.
Reproduction
Driven with a minimal LSP client over stdio against the released server jars —
no VS Code, no other IDE client — so nothing here depends on a particular
front-end.
Start any Boot application with the Actuator HTTP endpoints exposed
(
management.endpoints.web.exposure.include=*), reachable athttp://localhost:8080/actuator.initializethe language server, then sendworkspace/didChangeConfigurationwith:
{ "boot-java": { "remote-apps": [ { "jmxurl": "http://localhost:8080/actuator" } ] } }Wait, then call
sts/livedata/listConnected.5.2.0.RELEASE5.3.0.RELEASElistConnectedafter declaringlistProcessesfor the declared app"manualConnect": falsewritten explicitlyThe wait is not the variable:
5.3.0.RELEASEis still unconnected after 150 s,while
5.2.0.RELEASEconnects within the same window.Everything after an explicit connect is unchanged on both releases —
sts/liveprocess/connectedwithtype: "remote"andprocessKeyequal to thedeclared
jmxurl,sts/livedata/getreturning 409 beans and 30 mappings,sts/livedata/getLoggersanswering, and clearing the array to[]publishingsts/liveprocess/disconnected. Only the automatic attach is affected.Expected
Either
manualConnectfrom the settings entry is honoured (it is still read), orthe field is removed and the new behaviour documented. Right now a client can set
it, the server stores it, and the value never takes effect.
Environment
5.3.0.RELEASE(spring-boot-language-server-2.3.0-SNAPSHOT-exec.jar)vs
5.2.0.RELEASE(spring-boot-language-server-2.2.0-SNAPSHOT-exec.jar), bothfrom the official GitHub release VSIX