解决Neovim打开Java文件时JDTLS报Exit code13退出问题
JDTLS启动立即退出,提示Exit code 13 and signal 0(Neovim + kickstart.nvim + Mason)
环境背景
- Neovim配置基于kickstart.nvim
- JDTLS通过Mason安装管理
- Java环境使用jenv管理,当前版本为21.0.3
- 问题现象:打开Java文件时JDTLS进程立即退出,报错
Exit code 13 and signal 0;已尝试清理项目、重装JDTLS、改用nvim-jdtls等方案,均未解决
用户提供的Mason相关配置
local servers = { lua_ls = { settings = { Lua = { runtime = { version = 'LuaJIT' }, workspace = { checkThirdParty = false, library = { '${3rd}/luv/library', unpack(vim.api.nvim_get_runtime_file('', true)), }, }, completion = { callSnippet = 'Replace', }, }, }, }, jdtls = { root_dir = vim.fs.dirname(vim.fs.find({ 'gradlew', '.git', 'mvnw' }, { upward = true })[1]), }, angularls = {}, html = {}, ts_ls = {}, } vim.list_extend(ensure_installed, { 'stylua', -- Used to format Lua code }) require('mason-tool-installer').setup { ensure_installed = ensure_installed } require('java').setup {} require('mason-lspconfig').setup { handlers = { function(server_name) local server = servers[server_name] or {} server.capabilities = vim.tbl_deep_extend('force', {}, capabilities, server.capabilities or {}) require('lspconfig')[server_name].setup(server) end, }, ensure_installed = ensure_installed, automatic_installation = true, }
LSP日志片段
[START][2025-01-13 22:21:45] LSP logging initiated [ERROR][2025-01-13 22:21:45] .../vim/lsp/rpc.lua:770 "rpc" "/Users/hopecah/.local/share/nvim/mason/bin/java" "stderr" "WARNING: Using incubator modules: jdk.incubator.vector, jdk.incubator.foreign\n" [ERROR][2025-01-13 22:21:45] .../vim/lsp/rpc.lua:770 "rpc" "/Users/hopecah/.jenv/versions/21.0.3/bin/java" "stderr" "Disabling server log output. No more output will be sent after this.\n" [ERROR][2025-01-13 22:21:46] .../vim/lsp/rpc.lua:770 "rpc" "/Users/hopecah/.local/share/nvim/mason/bin/java" "stderr" "Jan 13, 2025 10:21:46 PM org.apache.aries.spifly.BaseActivator log\nINFO: Registered provider ch.qos.logback.classic.servlet.LogbackServletContainerInitializer of service jakarta.servlet.ServletContainerInitializer in bundle ch.qos.logback.classic\n" [ERROR][2025-01-13 22:21:46] .../vim/lsp/rpc.lua:770 "rpc" "/Users/hopecah/.local/share/nvim/mason/bin/java" "stderr" "Jan 13, 2025 10:21:46 PM org.apache.aries.spifly.BaseActivator log\nINFO: Registered provider ch.qos.logback.classic.spi.LogbackServiceProvider of service org.slf4j.spi.SLF4JServiceProvider in bundle ch.qos.logback.classic\n" [WARN][2025-01-13 22:27:15] ...lsp/handlers.lua:135 "The language server spring-boot triggers a registerCapability handler for workspace/didChangeWorkspaceFolders despite dynamicRegistration set to false. Report upstream, this warning is harmless" [WARN][2025-01-13 22:27:15] ...lsp/handlers.lua:135 "The language server spring-boot triggers a registerCapability handler for textDocument/semanticTokens despite dynamicRegistration set to false. Report upstream, this warning is harmless"
解决方案
1. 强制指定JDTLS使用的Java路径(解决版本/路径冲突)
日志显示JDTLS同时调用了Mason的Java和jenv的Java,存在路径冲突。修改jdtls配置,手动指定使用jenv管理的JDK并补全完整启动参数:
jdtls = { root_dir = function(fname) local root_files = { 'gradlew', 'mvnw', '.git', 'pom.xml', 'build.gradle' } local root = vim.fs.dirname(vim.fs.find(root_files, { upward = true, path = vim.fs.dirname(fname) })[1]) return root or vim.fn.getcwd() end, cmd = { -- 替换为你的jenv JDK路径 '/Users/hopecah/.jenv/versions/21.0.3/bin/java', '-Declipse.application=org.eclipse.jdt.ls.core.id1', '-Dosgi.bundles.defaultStartLevel=4', '-Declipse.product=org.eclipse.jdt.ls.core.product', '-Dlog.protocol=true', '-Dlog.level=ALL', '-Xmx1g', '--add-modules=ALL-SYSTEM', '--add-opens', 'java.base/java.util=ALL-UNNAMED', '--add-opens', 'java.base/java.lang=ALL-UNNAMED', -- 动态匹配JDTLS的launcher jar '-jar', vim.fn.glob('/Users/hopecah/.local/share/nvim/mason/packages/jdtls/plugins/org.eclipse.equinox.launcher_*.jar'), -- 对应系统配置目录:mac用config_mac,linux用config_linux,windows用config_win '-configuration', '/Users/hopecah/.local/share/nvim/mason/packages/jdtls/config_mac', -- 全局工作区缓存目录,自定义路径也可以 '-data', vim.fn.expand('~/.cache/jdtls/workspace') .. vim.fn.fnamemodify(vim.fn.getcwd(), ':p:h:t'), }, },
2. 清理JDTLS全局缓存
JDTLS全局缓存损坏会导致启动失败,直接删除缓存目录:
rm -rf ~/.cache/jdtls/
重启Neovim后,JDTLS会重新生成干净的缓存文件。
3. 修复root_dir的健壮性
原配置中如果找不到gradlew/.git/mvnw文件,会返回nil导致JDTLS启动失败。改用函数式写法,确保始终返回有效路径:
root_dir = function(fname) local root_files = { 'gradlew', 'mvnw', '.git', 'pom.xml', 'build.gradle' } local root = vim.fs.dirname(vim.fs.find(root_files, { upward = true, path = vim.fs.dirname(fname) })[1]) return root or vim.fn.getcwd() end,
4. 检查权限与环境变量
- 确认终端中
java -version输出为21.0.3,确保jenv的JDK全局生效 - 检查Mason的JDTLS目录权限,确保当前用户有读写权限:
chown -R $USER:$USER ~/.local/share/nvim/mason/packages/jdtls/
5. 禁用冲突的LSP插件
日志中出现spring-boot-ls的警告,暂时禁用spring-boot-ls,排查是否存在插件冲突:
在servers表中移除spring-boot-ls相关配置,或者在mason-lspconfig的ensure_installed中去掉该服务。
内容的提问来源于stack exchange,提问作者hhopec
相关产品推荐
相关产品推荐

