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

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),两者配合实现跨语言的代码导航与分析:

  1. 安装Kotlin语言服务器
    可以通过npm安装官方的kotlin-language-server:

    npm install -g kotlin-language-server
    

    也可以从GitHub源码编译后获取可执行文件。

  2. 配置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)
    
  3. 确保项目结构被正确识别
    确保Gradle项目已生成必要的构建文件(比如执行./gradlew eclipse生成.classpath/.project,或者让Kotlin LSP直接读取Gradle配置),两个语言服务器都会基于这些文件识别项目依赖与类路径,从而实现跨语言的跳转支持。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 17:47:34