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

LazyVim出现两个jdtls LSP客户端启动的问题求助

问题描述

我正在使用最新版本的LazyVim,当前遇到一个问题:打开Java文件时,有两个jdtls LSP客户端被同时启动。以下是:LspInfo的输出:

Press q or <Esc> to close this window. Press <Tab> to view server doc.
 
 Language client log: /home/jcabre/.local/state/nvim/lsp.log
 Detected filetype:   java
 
 2 client(s) attached to this buffer: 
 
 Client: jdtls (id: 1, bufnr: [338])
    filetypes:       
    autostart:       false
    root directory:  /home/jcabre/projects/gene/cultura/espaidoc/repositories/cloud
    cmd:             /home/jcabre/.local/share/nvim/mason/bin/jdtls --jvm-arg=-javaagent:/home/jcabre/.local/share/nvim/mason/packages/jdtls/lombok.jar
 
 Client: jdtls (id: 2, bufnr: [338, 357])
    filetypes:       
    autostart:       false
    root directory:  /home/jcabre/projects/gene/cultura/espaidoc/repositories/cloud/presentation/frontoffice/rest
    cmd:             /home/jcabre/.local/share/nvim/mason/bin/jdtls -configuration /home/jcabre/.cache/nvim/jdtls/rest/config -data /home/jcabre/.cache/nvim/jdtls/rest/workspace --jvm-arg=-javaagent:/home/jcabre/.local/share/nvim/mason/packages/jdtls/lombok.jar
 
 Configured servers list: lua_ls

我的项目结构如下:

.
├── pom.xml
├── application
│   ├── pom.xml
│   └── src
├── domain
│   ├── pom.xml
│   └── src
├── infrastructure
│   ├── pom.xml
│   └── src
├── presentation
│   ├── backoffice
│   │   ├── apigateway
│   │   │   ├── pom.xml
│   │   │   └── src
│   │   └── rest
│   │       ├── pom.xml
│   │       └── src
│   └── frontoffice
│       ├── apigateway
│       │   ├── pom.xml
│       │   └── src
│       └── rest
│           ├── pom.xml
│           └── src
└── README.md

父pom.xml内容:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>net.gencat.transversal.espaidoc</groupId>
    <artifactId>espaidoc-parent</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>pom</packaging>

    <name>espaidoc</name>
    <description>espaidoc parent</description>

    <properties>
        <maven.compiler.target>17</maven.compiler.target>
    <maven.compiler.source>17</maven.compiler.source>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <modules>
        <module>domain</module>
        <module>application</module>
        <module>infrastructure</module>
        <module>presentation/frontoffice/rest</module>
        <module>presentation/frontoffice/apigateway</module>
        <module>presentation/backoffice/rest</module>
        <module>presentation/backoffice/apigateway</module>
    </modules>

</project>

请问有什么修复该问题的思路或调试方法?


解决思路与调试方法

核心原因分析

出现两个jdtls实例,本质是LSP根目录检测逻辑识别到了多个有效根目录:一个是项目根目录(cloud/),另一个是子模块目录(cloud/presentation/frontoffice/rest/),jdtls对每个根目录都会启动独立实例。

修复与调试步骤

1. 强制统一根目录检测规则

修改jdtls的配置,让它只以包含父pom.xml的顶级目录作为根目录,忽略子模块的pom.xml。在LazyVim的jdtls配置中添加根目录检测逻辑:

return {
  "neovim/nvim-lspconfig",
  opts = {
    servers = {
      jdtls = {
        root_dir = function(fname)
          local root = require("lspconfig.util").root_pattern("pom.xml")(fname)
          -- 向上递归查找,确保取到最顶层的父pom所在目录
          while root do
            local parent_pom = vim.fn.fnamemodify(root, ":h") .. "/pom.xml"
            if vim.fn.filereadable(parent_pom) then
              root = vim.fn.fnamemodify(parent_pom, ":h")
            else
              break
            end
          end
          return root
        end,
      },
    },
  },
}

2. 排查自动启动触发逻辑

从LspInfo看两个实例autostart都是false,说明是手动触发或其他插件触发启动的。可以:

  • 检查是否有其他Java相关插件(比如nvim-dap、java-test等)在启动时额外调用了jdtls
  • 查看LSP日志(/home/jcabre/.local/state/nvim/lsp.log),搜索"jdtls"关键字,追踪两个实例的启动触发源

3. 清理jdtls缓存

关闭所有nvim实例,删除jdtls的缓存目录,让它重新生成单实例的配置:

rm -rf /home/jcabre/.cache/nvim/jdtls/

4. 验证多模块依赖处理

确认顶级pom.xml已正确包含所有子模块,jdtls本身支持maven多模块结构,单实例即可处理所有子模块的代码跳转、补全等功能,无需为每个子模块单独启动实例。


内容的提问来源于stack exchange,提问作者Jordi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 11:19:52