PAYATHON 2026

Neovim 0.12 配置 JDTLS 时为何出现 semantic tokens 错误?

数据小许

结论

这条报错出现在 Neovim 处理 semantic tokens 的 semantic_tokens.lua 阶段,说明处理请求时拿到的 request 是 nil。仅凭这段堆栈和 :checkhealth 的结果,无法确认这是 JDTLS 配置错误,也无法排除 Neovim 0.12-dev 的处理问题。

你的配置同时使用了 vim.lsp.enable("jdtls") 和 vim.lsp.start(...)。建议先统一启动方式,避免自动启动和手动启动的配置互相影响,再观察错误是否还会出现。

使用原生 LSP 配置启动

保留现有的 Java 命令参数,并在配置代码之前构造好 cmd1。然后用 vim.lsp.config 注册配置,由 vim.lsp.enable 管理启动;同时移除 FileType autocmd 中的 vim.lsp.start(...):

-- 先按现有配置构造 cmd1,包括 java、-jar、-configuration 和 -data 等参数。

vim.lsp.config("jdtls", {
  cmd = cmd1,
  filetypes = { "java" },
  root_markers = {
    "mvnw",
    "gradlew",
    "pom.xml",
    "build.gradle",
    ".git",
  },
})

vim.lsp.enable("jdtls")

如果要继续在 FileType autocmd 中手动调用 vim.lsp.start,就移除 vim.lsp.enable("jdtls"),并确认手动传入的配置包含正确的 cmd、root_dir 和 filetypes。先选一种方式验证即可。

检查根目录和工作区路径

你当前拼接工作区路径的代码是:

local workspace_dir = home .. "/jdtls_index" .. project_name

这会生成类似 /home/user/jdtls_indexmy-project 的路径。如果希望项目目录位于 jdtls_index 下,应在中间加上 /:

local workspace_dir = home .. "/jdtls_index/" .. project_name

这个路径格式本身无法解释 request 为 nil,但仍建议确认 JDTLS 的 -data 指向有效且按项目隔离的目录。也要检查 jar_file 和 config_linux 是否指向本机实际安装的文件。

错误仍出现时

统一启动方式并重启 Neovim 后,如果仍出现相同堆栈,可以临时关闭该客户端的 semantic tokens 能力,判断报错是否与这条处理路径有关:

vim.lsp.config("jdtls", {
  -- 保留 cmd、filetypes、root_markers 等配置
  on_init = function(client)
    client.server_capabilities.semanticTokensProvider = nil
  end,
})

这会禁用 JDTLS 的 semantic tokens 支持,可用于定位问题。如果错误消失,说明它与 semantic tokens 的处理有关,但还不足以单独确定根因。如果错误仍在,请检查启动的客户端及其配置,并记录完整堆栈和复现步骤,以便进一步判断是配置问题还是 Neovim 开发版本中的缺陷。

目前提供的信息不包含 JDTLS 日志或更完整的复现过程,因此无法确认具体根因。

备注:内容仅供参考。