You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

解决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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 23:38:10