{"record":{"id":"eaa01973b88f29f9","repo":"oraios/serena","slug":"no-main-equinox-launcher-jar-found-in-plugins-di","errorCode":null,"errorMessage":"No main Equinox launcher jar found in '{plugins_dir}'. Expected file like 'org.eclipse.equinox.launcher_<version>.jar'. Verify the JDTLS extraction is complete and not corrupted.","messagePattern":"No main Equinox launcher jar found in '(.+?)'\\. Expected file like 'org\\.eclipse\\.equinox\\.launcher_<version>\\.jar'\\. Verify the JDTLS extraction is complete and not corrupted\\.","errorType":"exception","errorClass":"SolidLSPException","httpStatus":null,"severity":"error","filePath":"src/solidlsp/language_servers/eclipse_jdtls.py","lineNumber":534,"sourceCode":"                jdtls_readonly_config_path=str(config_dir),\n                lombok_jar_path=lombok_path,\n                gradle_path=None,\n            )\n\n        @staticmethod\n        def _resolve_launcher_jar(plugins_dir: Path) -> Path:\n            \"\"\"\n            Locates the main Equinox launcher jar in JDTLS's ``plugins/`` directory, excluding\n            platform-specific native fragments like ``org.eclipse.equinox.launcher.cocoa.macosx.*``.\n\n            :return: path to the main launcher jar (e.g. ``org.eclipse.equinox.launcher_1.7.0.v....jar``)\n            \"\"\"\n            # main launcher matches: org.eclipse.equinox.launcher_<digit>...jar (single underscore,\n            # immediately followed by version digits — fragments have additional dotted segments).\n            pattern = re.compile(r\"^org\\.eclipse\\.equinox\\.launcher_\\d.*\\.jar$\")\n            matches = sorted(p for p in plugins_dir.glob(\"org.eclipse.equinox.launcher_*.jar\") if pattern.match(p.name))\n            if not matches:\n                raise SolidLSPException(\n                    f\"No main Equinox launcher jar found in '{plugins_dir}'. \"\n                    f\"Expected file like 'org.eclipse.equinox.launcher_<version>.jar'. \"\n                    f\"Verify the JDTLS extraction is complete and not corrupted.\"\n                )\n            # if multiple versions are present (rare), pick the highest by name\n            return matches[-1]\n\n        @staticmethod\n        def _resolve_config_dir(jdtls_root: Path) -> Path:\n            \"\"\"\n            Locates the platform-specific OSGi configuration directory inside the JDTLS root.\n\n            :return: path to ``config_<platform>/`` directory matching the current OS/arch\n            \"\"\"\n            platform_id = PlatformUtils.get_platform_id().value\n            config_dir_name = JDTLS_CONFIG_DIR_BY_PLATFORM.get(platform_id)\n            if config_dir_name is None:\n                raise SolidLSPException(","sourceCodeStart":516,"sourceCodeEnd":552,"githubUrl":"https://github.com/oraios/serena/blob/7fcbca7e62555ec2287ddb2f083caee805848ea6/src/solidlsp/language_servers/eclipse_jdtls.py#L516-L552","documentation":"This SolidLSPException is raised when no main Equinox OSGi launcher jar (org.eclipse.equinox.launcher_<version>.jar) can be found in the JDTLS plugins directory. The launcher jar is the entrypoint JDTLS is started with; its absence means the extraction is incomplete or corrupted. Native launcher fragments (with extra dotted segments after the underscore) are deliberately excluded by the regex.","triggerScenarios":"_resolve_launcher_jar globs plugins_dir for 'org.eclipse.equinox.launcher_*.jar', filters by the main-launcher regex, and raises when no match survives — during upstream JDTLS setup.","commonSituations":"Interrupted or partial tarball extraction; antivirus quarantined jars; user manually pruned 'duplicate' launcher jars (removing the real one, keeping only fragments); pointing plugins dir at wrong vscode-java subfolder.","solutions":["Re-extract the official jdt-language-server tarball to restore the full plugins/ directory.","Confirm with 'ls plugins/ | grep equinox.launcher' that a jar like org.eclipse.equinox.launcher_1.x.x.vYYYY.jar exists.","If a native fragment jar (name with extra dots after underscore) is present but the main jar isn't, the extraction is broken — restore it.","Disable antivirus interference or re-download if files were quarantined.","Fall back to default vscode-java VSIX mode by removing jdtls_path/lombok_path."],"exampleFix":"# before: plugins/ missing launcher\n$ ls /opt/jdtls/plugins | grep launcher\norg.eclipse.equinox.launcher.cocoa.macosx.x86_64_1.2.900.jar\n# after: re-extract\ntar -xzf jdt-language-server-latest.tar.gz -C /opt/jdtls\n$ ls /opt/jdtls/plugins | grep '^org.eclipse.equinox.launcher_'","handlingStrategy":"validation","validationCode":"from pathlib import Path\nplugins = Path(jdtls_path).expanduser() / 'plugins'\nlaunchers = [p for p in plugins.glob('org.eclipse.equinox.launcher_*.jar')\n             if not p.name.split('_')[1].split('.')[0].isdigit() or p.name.count('.') >= 0]\n# simple pre-check: at least one non-fragment launcher\nassert any(p.name.startswith('org.eclipse.equinox.launcher_') and p.name[len('org.eclipse.equinox.launcher_'):].split('.')[0].isdigit()\n           for p in plugins.glob('org.eclipse.equinox.launcher_*.jar')), 'main launcher jar missing'","typeGuard":"def has_main_launcher_jar(jdtls_root) -> bool:\n    import re\n    from pathlib import Path\n    pattern = re.compile(r'^org\\.eclipse\\.equinox\\.launcher_\\d.*\\.jar$')\n    plugins = Path(jdtls_root) / 'plugins'\n    return plugins.is_dir() and any(pattern.match(p.name) for p in plugins.glob('org.eclipse.equinox.launcher_*.jar'))","tryCatchPattern":"try:\n    ls = SolidLSP(java_config)\nexcept SolidLSPException as e:\n    if 'No main Equinox launcher jar' in str(e):\n        reextract_jdtls_tarball(jdtls_path)\n        ls = SolidLSP(java_config)\n    else:\n        raise","preventionTips":["Verify extraction completeness (file count/jar listing) right after untarring.","Never delete 'duplicate' equinox launcher jars from plugins/ manually.","Keep antivirus exclusions for the JDTLS directory to avoid quarantined jars.","Re-extract from the official snapshot tarball if plugins/ looks modified."],"tags":["java","jdtls","equinox","installation"],"backgroundTag":"missing-launcher-jar","analyzedSha":"7fcbca7e62555ec2287ddb2f083caee805848ea6","analyzedAt":"2026-08-29T00:04:09.619Z","schemaVersion":2},"datasetVersion":"2026-08-29T02:17:18.158Z"}