mirror of
https://github.com/l0ng-ai/openidea.git
synced 2026-11-06 08:07:49 +00:00
The managed runtime for the Java language server was a Temurin JRE, which lacks jdk.jdi. java-debug runs inside the jdtls JVM, so Debug failed with NoClassDefFoundError com/sun/jdi/VMDisconnectedException and "debug adapter did not answer initialize in time" while Run worked. Provision a full JDK instead and replace an already-downloaded JRE runtime (Temurin's JRE lists jdk.jdi in release MODULES although the image omits it, so suitability checks IMAGE_TYPE, javac and the modules); auto-picked installed runtimes must also carry jdk.compiler, jdk.jdi and jdk.unsupported, and a user-chosen language-server JDK without them gets a clear warning. Fixes #765.
26 lines
1.3 KiB
Rust
26 lines
1.3 KiB
Rust
//! Capabilities needed by the JVM hosting Java language-server bundles.
|
|
|
|
use std::path::Path;
|
|
|
|
/// jdtls' javac bundle, java-debug / hot code replace, and Lombok / Gradle tooling.
|
|
const BUNDLE_MODULES: &[&str] = &["jdk.compiler", "jdk.jdi", "jdk.unsupported"];
|
|
|
|
/// Require a full JDK, including the modules used by jdtls and its bundles.
|
|
/// Temurin JREs can list the build JDK's modules in `release` even when the runtime
|
|
/// image omits them, so module metadata alone does not establish suitability.
|
|
pub fn supports_java_bundles(home: &Path) -> bool {
|
|
let Ok(release) = std::fs::read_to_string(home.join("release")) else { return false };
|
|
let property =
|
|
|key: &str| release.lines().find_map(|line| line.trim().strip_prefix(key)).map(|v| v.trim().trim_matches('"'));
|
|
let javac = if cfg!(windows) { "javac.exe" } else { "javac" };
|
|
if property("IMAGE_TYPE=").is_some_and(|image| image.eq_ignore_ascii_case("jre"))
|
|
|| !home.join("bin").join(javac).is_file()
|
|
{
|
|
return false;
|
|
}
|
|
match property("MODULES=") {
|
|
Some(modules) => BUNDLE_MODULES.iter().all(|required| modules.split_whitespace().any(|m| m == *required)),
|
|
None => BUNDLE_MODULES.iter().all(|m| home.join("jmods").join(format!("{m}.jmod")).is_file()),
|
|
}
|
|
}
|