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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 11:23:21