oraios/serena · error · FileNotFoundError

Gradle Java home not found: {gradle_java_home}. Fix: update

Error message

Gradle Java home not found: {gradle_java_home}. Fix: update path in ~/.serena/serena_config.yml (ls_specific_settings -> java -> gradle_java_home), or remove the setting to use JAVA_HOME or the bundled JRE fallback

What it means

FileNotFoundError raised by _resolve_gradle_java_home when the gradle_java_home configured in ~/.serena/serena_config.yml (ls_specific_settings -> java -> gradle_java_home) does not exist on disk. This setting forces the Java home used for the Gradle daemon/imports; a stale path breaks Gradle project import in JDTLS.

Source

Thrown at src/solidlsp/language_servers/eclipse_jdtls.py:837

    def _resolve_gradle_java_home(self) -> str:
        """
        Resolve the Java home configured for JDTLS Gradle import settings.

        :return: Java home selected from explicit Gradle override, system ``JAVA_HOME`` when enabled, or bundled runtime.
        :raises FileNotFoundError: If an explicitly configured ``gradle_java_home`` path does not exist.
        """
        # explicit Gradle override...
        gradle_java_home = self._custom_settings.get("gradle_java_home")
        if gradle_java_home is not None:
            if not os.path.exists(gradle_java_home):
                error_msg = (
                    f"Gradle Java home not found: {gradle_java_home}. "
                    f"Fix: update path in ~/.serena/serena_config.yml (ls_specific_settings -> java -> gradle_java_home), "
                    f"or remove the setting to use JAVA_HOME or the bundled JRE fallback"
                )
                log.error(error_msg)
                raise FileNotFoundError(error_msg)
            log.info(f"Using Gradle Java home from custom location: {gradle_java_home}")
            return gradle_java_home

        # system JAVA_HOME fallback...
        use_system_java_home = self._custom_settings.get("use_system_java_home", False)
        if use_system_java_home:
            system_java_home = os.environ.get("JAVA_HOME")
            if system_java_home:
                log.info(f"Using system JAVA_HOME for Gradle: {system_java_home}")
                return system_java_home
            log.warning("use_system_java_home is set but JAVA_HOME is not set in environment, falling back to bundled JRE for Gradle")

        # bundled runtime fallback...
        log.info(f"Using bundled JRE for Gradle: {self.runtime_dependency_paths.jre_path}")
        return self.runtime_dependency_paths.jre_path

    def _resolve_configured_runtimes(self) -> list[dict[str, Any]]:
        """

View on GitHub (pinned to 7fcbca7e62)

Solutions

  1. Update gradle_java_home in ~/.serena/serena_config.yml to an existing JDK home
  2. Remove the gradle_java_home setting to fall back to JAVA_HOME or the bundled JRE
  3. Verify the path exists: ls <gradle_java_home>/bin/java
  4. If the JDK moved after an upgrade, point the setting at the new directory

Example fix

# before (~/.serena/serena_config.yml)
ls_specific_settings:
  java:
    gradle_java_home: /usr/lib/jvm/java-17-temurin  # deleted
# after
ls_specific_settings:
  java:
    gradle_java_home: /usr/lib/jvm/temurin-21-jdk-amd64
Defensive patterns

Strategy: validation

Validate before calling

from pathlib import Path
import yaml
def validate_gradle_java_home(cfg_path: str = "~/.serena/serena_config.yml") -> bool:
    cfg = yaml.safe_load(Path(cfg_path).expanduser().read_text())
    p = cfg.get("ls_specific_settings", {}).get("java", {}).get("gradle_java_home")
    return p is None or Path(p).is_dir()

Type guard

def gradle_java_home_valid(cfg: dict) -> bool:
    p = cfg.get("ls_specific_settings", {}).get("java", {}).get("gradle_java_home")
    return p is None or (isinstance(p, str) and Path(p).is_dir())

Try / catch

try:
    params = provider._create_base_initialize_params()
except FileNotFoundError as e:
    if str(e).startswith("Gradle Java home not found"):
        del cfg["ls_specific_settings"]["java"]["gradle_java_home"]  # fall back to JAVA_HOME/bundled JRE
        params = provider._create_base_initialize_params()
    else:
        raise

Prevention

When it happens

Trigger: _create_base_initialize_params -> _resolve_gradle_java_home where gradle_java_home is set in custom settings but Path(gradle_java_home) does not exist (is_dir check on the path fails).

Common situations: JDK removed or upgraded after the config was written; config copied from another machine; symlink target deleted; path written for Windows used on Linux or vice versa.

Related errors


AI-assisted analysis of oraios/serena@7fcbca7e62 (2026-08-29). Data as JSON: /api/errors/3fbdb006171ef69e. Report an issue: GitHub.