From b79522fd0331fb2d9d467734d1d96cdb73180d72 Mon Sep 17 00:00:00 2001 From: kevinh <45650311+kevinh458@users.noreply.github.com> Date: Mon, 26 Oct 2026 23:08:52 +0800 Subject: [PATCH] fix(java): Point the missing-JDK error at the Language Server JDK setting (#31) Root cause: missing_runtime_message only suggested JAVA_HOME (process-wide) although a per-app Language Server JDK setting exists since #21. Siblings covered: server_jdk_too_old_message now names the same Settings page via a shared SERVER_JDK_SETTING const; both asserted in tests. --- crates/ide-sdk/src/java.rs | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/crates/ide-sdk/src/java.rs b/crates/ide-sdk/src/java.rs index e85fc61c..c021612c 100644 --- a/crates/ide-sdk/src/java.rs +++ b/crates/ide-sdk/src/java.rs @@ -343,6 +343,9 @@ pub fn configure_jdtls( } } +/// Where the JDK that runs jdtls is chosen, named as the settings dialog shows it. +const SERVER_JDK_SETTING: &str = "Settings › Languages & Frameworks › Java › Language Server › JDK"; + fn missing_runtime_message(jdks: &[Jdk], min_java: u32) -> String { let mut found: Vec = jdks.iter().map(|j| j.major).collect(); found.sort_unstable(); @@ -354,15 +357,16 @@ fn missing_runtime_message(jdks: &[Jdk], min_java: u32) -> String { format!("found JDK {}", list.join(", ")) }; format!( - "jdtls needs JDK {min_java} or newer to run ({found}). Install one (or point JAVA_HOME at it) and \ - restart the server; the project can still target an older Java version." + "jdtls needs JDK {min_java} or newer to run ({found}). Pick one in {SERVER_JDK_SETTING} (it restarts \ + automatically), or install a newer JDK and restart the server; the project can still target an older \ + Java version." ) } fn server_jdk_too_old_message(jdk: &Jdk, min_java: u32) -> String { format!( "The language server JDK ({}, JDK {}) is too old: jdtls needs JDK {min_java} or newer. Choose another \ - one in Settings › Languages & Frameworks › Java, or set it to Auto.", + one in {SERVER_JDK_SETTING}, or set it to Auto.", jdk.home.display(), jdk.major ) @@ -570,6 +574,8 @@ mod tests { assert!(!cfg.env.contains_key("JAVA_HOME")); let err = cfg.launch_error.unwrap(); assert!(err.contains("JDK 21 or newer") && err.contains("found JDK 8, 17"), "{err}"); + // The user cannot be sent to JAVA_HOME alone: the language server JDK is a setting. + assert!(err.contains(SERVER_JDK_SETTING) && !err.contains("point JAVA_HOME at it"), "{err}"); let mut cfg = jdtls(); configure_jdtls(&mut cfg, Path::new("/p"), Path::new("/data"), &[], None, None, JDTLS_MIN_JAVA, &[], None); @@ -633,6 +639,7 @@ mod tests { assert!(!cfg.env.contains_key("JAVA_HOME")); let err = cfg.launch_error.unwrap(); assert!(err.contains("/jdk21") && err.contains("JDK 25 or newer"), "{err}"); + assert!(err.contains(SERVER_JDK_SETTING), "both messages point at the same setting: {err}"); } #[test]