eclipse.jdt.ls是否支持Kotlin?多Gradle项目Neovim跳转问题求助
我有一个多模块Gradle项目,项目中同时包含Java和Kotlin文件。已将Neovim配置为使用eclipse.jdt.ls和nvim-jdtls,但无法正常跳转到Kotlin文件——经检查,Kotlin文件并未被纳入jdtls-workspace缓存的类路径中。
请问在Neovim中同时使用Java和Kotlin文件有解决方案吗?更关键的是,eclipse-jdt-ls是否支持Kotlin文件?我猜测不支持,但未找到明确的官方文档说明。
以下是我的ftplugin/java.lua配置文件:
local project_name = vim.fn.fnamemodify(vim.fn.getcwd(), ':p:h:t') local workspace_dir = '/Users/josephclark/.cache/jdtls-workspace/' .. project_name local capabilities = vim.lsp.protocol.make_client_capabilities() capabilities = require('cmp_nvim_lsp').default_capabilities(capabilities) local config = { cmd = { '/Library/Java/JavaVirtualMachines/temurin-17.jdk/Contents/Home/bin/java', "-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", '-javaagent:/Users/josephclark/.local/share/java/lombok.jar', "-Xms1g", "--add-modules=ALL-SYSTEM", "--add-opens", "java.base/java.util=ALL-UNNAMED", "--add-opens", "java.base/java.lang=ALL-UNNAMED", '-jar', '/Users/josephclark/.local/share/java/jdt-language-server-1.10.0-202204131925/plugins/org.eclipse.equinox.launcher_1.6.400.v20210924-0641.jar', '-configuration', '/Users/josephclark/.local/share/java/jdt-language-server-1.10.0-202204131925/config_mac/', '-data', workspace_dir }, capabilities = capabilities } -- This starts a new client & server, -- or attaches to an existing client & server depending on the `root_dir`. require('jdtls').start_or_attach(config) local opts = { noremap = true, silent = true } vim.keymap.set('n', '<leader>e', vim.diagnostic.open_float, opts) vim.keymap.set('n', '[d', vim.diagnostic.goto_prev, opts) vim.keymap.set('n', ']d', vim.diagnostic.goto_next, opts) vim.keymap.set('n', '<leader>q', vim.diagnostic.setloclist, opts) vim.keymap.set('n', 'gD', vim.lsp.buf.declaration, opts) vim.keymap.set('n', 'gd', vim.lsp.buf.definition, opts) vim.keymap.set('n', 'gi', vim.lsp.buf.implementation, opts) vim.keymap.set('n', 'K', vim.lsp.buf.hover, opts) vim.keymap.set('n', '<C-k>', vim.lsp.buf.signature_help, opts) --vim.keymap.set('n', '<leader>wa', vim.lsp.buf.add_workspace_folder, opts) --vim.keymap.set('n', '<space>wr', vim.lsp.buf.remove_workspace_folder, opts) vim.keymap.set('n', '<leader>wl', function() print(vim.inspect(vim.lsp.buf.list_workspace_folders())) end, opts) vim.keymap.set('n', '<leader>D', vim.lsp.buf.type_definition, opts) vim.keymap.set('n', '<leader>rn', vim.lsp.buf.rename, opts) vim.keymap.set('n', '<leader>ca', vim.lsp.buf.code_action, opts) vim.keymap.set('n', 'gr', vim.lsp.buf.references, opts) vim.keymap.set('n', '<leader>f', function() vim.lsp.buf.format { async = true } end, opts)
关于eclipse-jdt-ls对Kotlin的支持
eclipse-jdt-ls不原生支持Kotlin,它是专为Java开发打造的语言服务器,只会解析Java相关文件与编译产物,不会处理Kotlin源码,因此Kotlin类不会被纳入jdtls的工作区缓存,跨语言跳转自然无法生效。
Neovim中Java+Kotlin项目的解决方案
需要同时配置jdtls(处理Java)和Kotlin语言服务器(处理Kotlin),两者配合实现跨语言的代码导航与分析:
安装Kotlin语言服务器
可以通过npm安装官方的kotlin-language-server:npm install -g kotlin-language-server也可以从GitHub源码编译后获取可执行文件。
配置Kotlin文件的LSP关联
在Neovim中创建ftplugin/kotlin.lua文件,添加以下配置(基于nvim-lspconfig):local capabilities = vim.lsp.protocol.make_client_capabilities() capabilities = require('cmp_nvim_lsp').default_capabilities(capabilities) require('lspconfig').kotlin_language_server.setup({ capabilities = capabilities, root_dir = require('lspconfig.util').root_pattern('settings.gradle', 'build.gradle', 'settings.gradle.kts', 'build.gradle.kts') }) -- 复用已有的LSP快捷键映射 local opts = { noremap = true, silent = true } vim.keymap.set('n', '<leader>e', vim.diagnostic.open_float, opts) vim.keymap.set('n', '[d', vim.diagnostic.goto_prev, opts) vim.keymap.set('n', ']d', vim.diagnostic.goto_next, opts) vim.keymap.set('n', '<leader>q', vim.diagnostic.setloclist, opts) vim.keymap.set('n', 'gD', vim.lsp.buf.declaration, opts) vim.keymap.set('n', 'gd', vim.lsp.buf.definition, opts) vim.keymap.set('n', 'gi', vim.lsp.buf.implementation, opts) vim.keymap.set('n', 'K', vim.lsp.buf.hover, opts) vim.keymap.set('n', '<C-k>', vim.lsp.buf.signature_help, opts) vim.keymap.set('n', '<leader>D', vim.lsp.buf.type_definition, opts) vim.keymap.set('n', '<leader>rn', vim.lsp.buf.rename, opts) vim.keymap.set('n', '<leader>ca', vim.lsp.buf.code_action, opts) vim.keymap.set('n', 'gr', vim.lsp.buf.references, opts) vim.keymap.set('n', '<leader>f', function() vim.lsp.buf.format { async = true } end, opts)确保项目结构被正确识别
确保Gradle项目已生成必要的构建文件(比如执行./gradlew eclipse生成.classpath/.project,或者让Kotlin LSP直接读取Gradle配置),两个语言服务器都会基于这些文件识别项目依赖与类路径,从而实现跨语言的跳转支持。
内容的提问来源于stack exchange,提问作者clarkjoe

