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 日志或更完整的复现过程,因此无法确认具体根因。
备注:内容仅供参考。
