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

Neovim中jdtls无法识别Gradle项目文件及JDK路径报错修复

问题

在Gradle项目中使用Neovim的nvim-jdtls运行jdtls时,语言服务器(LSP)抛出无法找到指定JDK17路径的错误,并将文件标记为非项目文件。LSP启动后仅能检测语法错误,无法识别跨文件上下文的错误(如未实现抽象类方法)。

LSP日志

[START][2024-07-30 15:05:18] LSP logging initiated
[ERROR][2024-07-30 15:05:18] .../vim/lsp/rpc.lua:734    "rpc"   "java"  "stderr"    "WARNING: Using incubator modules: jdk.incubator.vector, jdk.incubator.foreign\r\n"
[WARN][2024-07-30 15:05:21] ...lsp/handlers.lua:537 "Jul 30, 2024, 3:05:21 PM Synchronize project app failed due to an error while importing the root project.\norg.eclipse.buildship.core.internal.GradlePluginsRuntimeException: org.eclipse.core.internal.resources.ResourceException: Invalid project description.\norg.eclipse.buildship.core.internal.ImportRootProjectException: org.eclipse.buildship.core.internal.GradlePluginsRuntimeException: org.eclipse.core.internal.resources.ResourceException: Invalid project description.\r\n\tat org.eclipse.buildship.core.internal.workspace.ImportRootProjectOperation.run(ImportRootProjectOperation.java:53)\r\n\tat org.eclipse.buildship.core.internal.DefaultGradleBuild$SynchronizeOperation.runInToolingApi(DefaultGradleBuild.java:225)\r\n\tat org.eclipse.buildship.core.internal.operation.DefaultToolingApiOperationManager$WorkspaceRunnableAdapter.run(DefaultToolingApiOperationManager.java:58)\r\n\tat org.eclipse.core.internal.resources.Workspace.run(Workspace.java:2313)\r\n\tat org.eclipse.core.internal.resources.Workspace.run(Workspace.java:2338)\r\n\tat org.eclipse.buildship.core.internal.operation.DefaultToolingApiOperationManager.run(DefaultToolingApiOperationManager.java:39)\r\n\tat org.eclipse.buildship.core.internal.DefaultGradleBuild$SynchronizeOperation.run(DefaultGradleBuild.java:192)\r\n\tat org.eclipse.buildship.core.internal.DefaultGradleBuild.synchronize(DefaultGradleBuild.java:100)\r\n\tat org.eclipse.buildship.core.internal.DefaultGradleBuild.synchronize(DefaultGradleBuild.java:86)\r\n\tat org.eclipse.jdt.ls.core.internal.managers.GradleProjectImporter.startSynchronization(GradleProjectImporter.java:352)\r\n\tat org.eclipse.jdt.ls.core.internal.managers.GradleProjectImporter.importDir(GradleProjectImporter.java:240)\r\n\tat org.eclipse.jdt.ls.core.internal.managers.GradleProjectImporter.importToWorkspace(GradleProjectImporter.java:191)\r\n\tat org.eclipse.jdt.ls.core.internal.managers.ProjectsManager.importProjects(ProjectsManager.java:124)\r\n\tat org.eclipse.jdt.ls.core.internal.managers.ProjectsManager.initializeProjects(ProjectsManager.java:107)\r\n\tat org.eclipse.jdt.ls.core.internal.handlers.InitHandler$1.runInWorkspace(InitHandler.java:244)\r\n\tat org.eclipse.core.internal.resources.InternalWorkspaceJob.run(InternalWorkspaceJob.java:42)\r\n\tat org.eclipse.core.internal.jobs.Worker.run(Worker.java:63)\r\nCaused by: org.eclipse.buildship.core.internal.GradlePluginsRuntimeException: org.eclipse.core.internal.resources.ResourceException: Invalid project description.\r\n\tat org.eclipse.buildship.core.internal.workspace.DefaultWorkspaceOperations.createProject(DefaultWorkspaceOperations.java:128)\r\n\tat org.eclipse.buildship.core.internal.workspace.ImportRootProjectOperation.importRootProject(ImportRootProjectOperation.java:95)\r\n\tat org.eclipse.buildship.core.internal.workspace.ImportRootProjectOperation.access$200(ImportRootProjectOperation.java:39)\r\n\tat org.eclipse.buildship.core.internal.workspace.ImportRootProjectOperation$1.run(ImportRootProjectOperation.java:68)\r\n\tat org.eclipse.core.internal.resources.Workspace.run(Workspace.java:2313)\r\n\tat org.eclipse.core.internal.resources.Workspace.run(Workspace.java:2333)\r\n\tat org.eclipse.buildship.core.internal.workspace.ImportRootProjectOperation.runInWorkspace(ImportRootProjectOperation.java:58)\r\n\tat org.eclipse.buildship.core.internal.workspace.ImportRootProjectOperation.run(ImportRootProjectOperation.java:51)\r\n\t... 16 more\r\nCaused by: org.eclipse.core.internal.resources.ResourceException: Invalid project description.\r\n\tat org.eclipse.core.internal.resources.Project.checkDescription(Project.java:173)\r\n\tat org.eclipse.core.internal.resources.Project.assertCreateRequirements(Project.java:57)\r\n\tat org.eclipse.core.internal.resources.Project.create(Project.java:266)\r\n\tat org.eclipse.core.internal.resources.Project.create(Project.java:252)\r\n\tat org.eclipse.buildship.core.internal.workspace.DefaultWorkspaceOperations.createProject(DefaultWorkspaceOperations.java:113)\r\n\t... 23 more\r\n"
[WARN][2024-07-30 15:05:22] ...lsp/handlers.lua:137 "The language server jdtls triggers a registerCapability handler despite dynamicRegistration set to false. Report upstream, this warning is harmless"

项目结构

app
└───src
    ├───main
    │   ├───java
    │   │   └───org
    │   │       └───example
    │   │           
    │   └───resources
    └───test
        ├───java
        │   └───org
        │       └───example
        └───resources

build.gradle与src目录同级,代码声明包名为package org.example。

当前jdtls配置

local root_markers = {'.git', 'mvnw', 'gradlew', 'pom.xml', 'build.gradle'}
local root_dir = require('jdtls.setup').find_root(root_markers)
local workspace_folder = root_dir .. '/jdtls/'
local jdtlsconfig = {
    cmd = {
    'java', -- or '/path/to/java17_or_newer/bin/java'
            -- depends on if `java` is in your $PATH env variable and if it points to the right version.

    '-Declipse.application=org.eclipse.jdt.ls.core.id1',
    '-Dosgi.bundles.defaultStartLevel=4',
    '-Declipse.product=org.eclipse.jdt.ls.core.product',
    '-Dlog.protocol=true',
    '-Dlog.level=ALL',
    '-Xmx1g',
    '--add-modules=ALL-SYSTEM',
    '--add-opens', 'java.base/java.util=ALL-UNNAMED',
    '--add-opens', 'java.base/java.lang=ALL-UNNAMED',
    '-jar', 'C:/Users/Owner/AppData/Local/eclipse-jdtls/plugins/org.eclipse.equinox.launcher_1.6.400.v20210924-0641.jar',
    '-configuration', 'C:/Users/Owner/AppData/Local/eclipse-jdtls/config_win/', 
    '-data', workspace_folder},
    root_dir = root_dir ,
    settings = {
        java = {
            configuration = {
                  runtimes = {
              {name = "JavaSE-17",
              path = '"C:\\Program Files\\Amazon Corretto\\jdk17.0.7_7\\"'},
              {name = "JavaSE-11",
              path = '"C:\\Program Files\\Amazon Corretto\\jdk11.0.15_9\\"'}
              }
                },
        import = {
          gradle = {
            enabled = true
          }
        }
        }
    }
}

require('jdtls').start_or_attach(jdtlsconfig)

猜测问题可能是JDK路径包含空格导致LSP无法访问运行时,该如何解决?


解决方法

你的猜测正确,问题出在JDK路径的多余双引号上,导致jdtls无法解析带空格的路径。按以下步骤修复:

  • 移除JDK路径的双引号
    修改配置中runtimes里的path值,去掉包裹路径的双引号。正确格式如下:

    runtimes = {
        {name = "JavaSE-17", path = "C:\\Program Files\\Amazon Corretto\\jdk17.0.7_7\\"},
        {name = "JavaSE-11", path = "C:\\Program Files\\Amazon Corretto\\jdk11.0.15_9\\"}
    }
    

    Windows系统下路径用双反斜杠转义即可,无需额外加引号。

  • 确保启动jdtls的Java版本合规
    检查cmd里的java命令是否指向JDK17或更高版本。若系统PATH中的Java版本不符合要求,直接替换为JDK17的绝对路径:

    cmd = {
        'C:\\Program Files\\Amazon Corretto\\jdk17.0.7_7\\bin\\java',
        -- 其余参数保持不变
    }
    
  • 清理旧工作区并重启
    删除项目根目录下的jdtls工作区文件夹,重启Neovim后重新启动jdtls,避免旧缓存干扰。

  • 验证Gradle导入配置
    确认settings.java.import.gradle.enabled设为true,让jdtls正确识别Gradle项目结构,建立跨文件上下文关联。

完成以上操作后,jdtls应能正确找到JDK运行时,成功导入Gradle项目,从而识别跨文件的代码错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 08:32:31