Neovim中jdtls配置无法持久化:仅首个Java缓冲区生效
解决nvim-jdtls仅对首次打开的Java缓冲区生效的问题
问题原因
你的配置中,config 函数只会在第一个Java文件打开、插件首次加载时执行一次:
root_dir被固定为首次打开文件对应的项目根目录require('jdtls').start_or_attach(config)只执行了一次,后续打开其他Java文件(哪怕是不同项目的)不会重新初始化
修复方案
把初始化逻辑放到 FileType java 的自动命令里,确保每次打开Java文件时都能根据当前文件路径计算正确的根目录,并启动/附加LSP:
return { 'mfussenegger/nvim-jdtls', ft = 'java', config = function() -- 定义自动命令,每次打开Java文件时执行 vim.api.nvim_create_autocmd('FileType', { pattern = 'java', callback = function() -- 针对当前缓冲区计算根目录 local root_dir = vim.fs.dirname(vim.fs.find({'gradlew', '.git', 'mvnw'}, { upward = true, path = vim.fn.expand('%:p') })[1]) -- 构建jdtls配置 local config = { cmd = { vim.fn.stdpath('data') .. '/mason/bin/jdtls' }, root_dir = root_dir, } -- 启动或附加LSP require('jdtls').start_or_attach(config) end, group = vim.api.nvim_create_augroup('jdtls_setup', { clear = true }), }) end }
关键改进点
- 使用
vim.fn.expand('%:p')指定当前文件路径给vim.fs.find,确保根目录计算基于当前打开的文件,而非首次加载时的路径 - 通过自动命令触发初始化逻辑,每个Java缓冲区打开时都会执行一次,适配多项目场景
- 创建独立的自动命令组
jdtls_setup,方便管理和清理
内容的提问来源于stack exchange,提问作者leosebben
相关产品推荐
相关产品推荐

