oraios/serena · error · SolidLSPException
Config directory '{config_dir}' not found. This JDTLS distri
Error message
Config directory '{config_dir}' not found. This JDTLS distribution does not support platform '{platform_id}'. Verify you downloaded the correct tar.gz for your OS/architecture. What it means
SolidLSPException thrown by _resolve_config_dir when the config/<platform> subdirectory does not exist inside the resolved JDTLS install root. JDTLS ships separate config dirs per OS/arch (e.g. config_linux, config_mac_arm); if the tar.gz was built for a different platform, the directory for the current platform_id is missing. This guards against launching JDTLS with a wrong or corrupt distribution.
Source
Thrown at src/solidlsp/language_servers/eclipse_jdtls.py:558
return matches[-1]
@staticmethod
def _resolve_config_dir(jdtls_root: Path) -> Path:
"""
Locates the platform-specific OSGi configuration directory inside the JDTLS root.
:return: path to ``config_<platform>/`` directory matching the current OS/arch
"""
platform_id = PlatformUtils.get_platform_id().value
config_dir_name = JDTLS_CONFIG_DIR_BY_PLATFORM.get(platform_id)
if config_dir_name is None:
raise SolidLSPException(
f"Unsupported platform '{platform_id}' for upstream JDTLS mode. "
f"Supported platforms: {sorted(set(JDTLS_CONFIG_DIR_BY_PLATFORM.values()))}."
)
config_dir = jdtls_root / config_dir_name
if not config_dir.is_dir():
raise SolidLSPException(
f"Config directory '{config_dir}' not found. "
f"This JDTLS distribution does not support platform '{platform_id}'. "
f"Verify you downloaded the correct tar.gz for your OS/architecture."
)
return config_dir
@staticmethod
def _resolve_system_jdk(custom_settings: SolidLSPSettings.CustomLSSettings) -> tuple[str, str]:
"""
Resolves the system-installed JDK home and ``java`` executable, validates the version.
The ``java`` executable is located by priority: ``java_home`` setting ->
``JAVA_HOME`` env var -> ``java`` in PATH. The actual JDK home directory and
major version are then discovered by querying the JVM itself via
``java -XshowSettings:properties -version`` — this is the single source of truth
and works correctly even when the locator is a system stub (e.g. ``/usr/bin/java``
on macOS, which delegates to ``/usr/libexec/java_home`` under the hood and does not
resolve to the real JDK home via simple path traversal).View on GitHub (pinned to 7fcbca7e62)
Solutions
- Download the JDTLS tar.gz matching your OS/architecture and point jdtls_root at the extracted directory
- Verify the directory <jdtls_root>/<config_dir_name> (e.g. config_linux) actually exists
- Re-extract the archive fully; check it was not partially copied
- If the platform is genuinely unsupported, use a JDTLS build that ships a config dir for it
Example fix
// before
jdtls_root = Path("/opt/jdt-language-server-latest") # wrong-arch tarball
// after
jdtls_root = Path("/opt/jdt-language-server-1.40.0-202409261450") # matches linux x86_64; contains config_linux/ Defensive patterns
Strategy: validation
Validate before calling
from pathlib import Path
def validate_jdtls_root(jdtls_root: str, config_dir_name: str) -> bool:
return (Path(jdtls_root) / config_dir_name).is_dir() Type guard
def has_platform_config(jdtls_root: Path, config_dir_name: str) -> bool:
return jdtls_root.is_dir() and (jdtls_root / config_dir_name).is_dir() Try / catch
from solidlsp import SolidLSPException
try:
ls = EclipseJDTLS._setup_from_existing_install(jdtls_root)
except SolidLSPException as e:
if "Config directory" in str(e):
re_download_correct_tarball(platform_id) # then retry
else:
raise Prevention
- Download the JDTLS tar.gz matching your exact OS/arch and keep it alongside the config dirs
- Script the download so the correct platform artifact is fetched per-runner in CI
- Verify the extracted tree contains config_* before pointing the library at it
- Avoid hand-copying parts of the extracted distribution
When it happens
Trigger: Calling _setup_from_existing_install with a jdtls_root that lacks the platform-specific config directory (config_dir_name derived from platform_id), e.g. pointing the existing-install path at a JDTLS tar.gz downloaded for a different OS/architecture, or an incomplete extraction.
Common situations: Downloading the linux x86_64 JDTLS tar.gz but running on mac arm64; copying only part of the extracted distribution; hardcoding a jdtls_root from another machine; CI cache restoring a mismatched artifact.
Related errors
- Both 'jdtls_path' and 'lombok_path' must be set together in
- Resource paths inside the vscode-java {vscode_java_version}
- Provided jdtls_path '{jdtls_path}' is not an existing direct
- Invalid jdtls_path '{jdtls_path}': 'plugins/' directory not
- Provided lombok_path '{lombok_path}' does not exist or is no
AI-assisted analysis of oraios/serena@7fcbca7e62 (2026-08-29).
Data as JSON: /api/errors/f36f912bd4eeda29.
Report an issue: GitHub.