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
相关产品推荐
相关产品推荐

