Neovim 使用 lsp-zero/mason 设置 jdtls

问题描述 投票:0回答:2

作为即将到来的 2023 年新年的一部分,我想尝试将我的开发环境迁移到 vim 或 neovim。我已经完成了一些设置,并且已经进行了 go 和 js/ts 设置,并且看起来工作得很好。自动完成、检查和导入管理。

尝试让 lsp-zero 和 java 工作却被证明是一场噩梦(因为 java 当然会成为一个问题)。我打开了一个 java 文件 lsp-zero was baller 并要求安装

jdtls
,它似乎有效,瞧什么都没有......我只是突出显示了代码。没有自动完成或导入管理。

我添加了以下内容来测试

-- configure an individual server
lsp.configure('jdtls', {
  flags = {
    debounce_text_changes = 150,
  },
  on_attach = function(client, bufnr)
    print('lsp server (jdtls) attached')
  end
})

lsp.configure('gopls', {
  flags = {
    debounce_text_changes = 150,
  },
  on_attach = function(client, bufnr)
    print('lsp server (gopls) attached')
  end
})

Java 未获取 lsp 服务器

Go 接得很好

有人知道需要额外的配置吗?我没有看到任何特别指出的内容。

--- 配置编辑 ---

我更新了配置以调用 Windows 版本的脚本。我还添加了数据路径和 root_dir。 lsp 仍然没有触发。

require'lspconfig'.jdtls.setup{
 cmd = {
        'jdtls-win.cmd',
        "-configuration",
        "C:\\Users\\Coury\\AppData\\Local\\nvim-data\\mason\\packages\\jdtls\\config_win",
        "-jar",
        "C:\\Users\\Coury\\AppData\\Local\\nvim-data\\mason\\packages\\jdtls\\plugins\\org.eclipse.equinox.launcher_1.6.400.v20210924-0641.jar",
        "-data",
        "C:\\Users\\Coury\\Documents\\Code\\interviews\\truleo\\app",
    },
    single_file_support = true,
    root_dir = function() 
        return "C:\\Users\\Coury\\Documents\\Code\\interviews\\truleo\\app"
    end,
    flags = {
        debounce_text_changes = 150,
    },
    on_attach = function(client, bufnr)
        print('lsp server (jdtls) attached')
    end
}
java neovim eclipse-jdt
2个回答
2
投票

请务必将 java 路径添加到

bashrc
文件中,并通过
Mason

重试安装

如果您在设置 mason/jdlts 时仍然遇到问题,请继续执行以下说明

  1. 按照其安装说明安装eclipse.jdt.ls

  2. 添加插件: 插头

    mfussenegger/nvim-jdtls
    和 packer.nvim:
    mfussenegger/nvim-jdtls

  3. 使用以下代码在插件目录中创建您的个人

    jdlts
    配置文件。

  4. 获取新配置并打开任何 java 文件。


-- Java.lua

local config = {
    cmd = {
        --
        "java", -- Or the absolute path '/path/to/java11_or_newer/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",
        "-Xms1g",
        "--add-modules=ALL-SYSTEM",
        "--add-opens",
        "java.base/java.util=ALL-UNNAMED",
        "--add-opens",
        "java.base/java.lang=ALL-UNNAMED",
        --
        "-jar",
        "/path/to/jdtls_install_location/plugins/org.eclipse.equinox.launcher_VERSION_NUMBER.jar",
        "-configuration", "/path/to/jdtls_install_location/config_SYSTEM",
        "-data", "/Users/YOUR_MACHINE_NAME/local/share/nvim/java"
    },
    settings = {
        java = {
            signatureHelp = {enabled = true},
            import = {enabled = true},
            rename = {enabled = true}
        }
    },
    init_options = {
        bundles = {}
    }
}


2
投票

我建议使用 mfussenegger/nvim-jdtls 来运行和配置语言服务器。

只需为 java 设置一个 FTPlugin,只要打开 java 文件/存储库,它就会调用

jdtls.start_or_attach(jdtls_config)
,这将启动语言服务器并将其附加到您的缓冲区,可以通过
:LspInfo
进行验证。

ftplugin/java.lua:

local jdtls_config = require("myconfig.lsp.jdtls").setup()
local pkg_status, jdtls = pcall(require,"jdtls")
if not pkg_status then
  vim.notify("unable to load nvim-jdtls", "error")
  return
end
jdtls.start_or_attach(jdtls_config)

以及使用jdtls的相应配置(通过mason安装) 您可能想提供自己的功能和 on_attach 函数,但除此之外它应该会给您一个很好的推动,让您朝着正确的方向前进。

myconfig/lsp/jdtls.lua

local opts = {
  cmd = {},
  settings = {
    java = {
      signatureHelp = { enabled = true },
      completion = {
        favoriteStaticMembers = {},
        filteredTypes = {
          -- "com.sun.*",
          -- "io.micrometer.shaded.*",
          -- "java.awt.*",
          -- "jdk.*",
          -- "sun.*",
        },
      },
      sources = {
        organizeImports = {
          starThreshold = 9999,
          staticStarThreshold = 9999,
        },
      },
      codeGeneration = {
        toString = {
          template = "${object.className}{${member.name()}=${member.value}, ${otherMembers}}",
        },
        useBlocks = true,
      },
      configuration = {
        runtimes = {
          {
            name = "JavaSE-1.8",
            path = "/Library/Java/JavaVirtualMachines/amazon-corretto-8.jdk/Contents/Home",
            default = true,
          },
          {
            name = "JavaSE-17",
            path = "/Library/Java/JavaVirtualMachines/jdk-17.jdk/Contents/Home",
          },
          {
            name = "JavaSE-19",
            path = "/Library/Java/JavaVirtualMachines/jdk-19.jdk/Contents/Home",
          },
        },
      },
    },
  },
}

local function setup()
  local pkg_status, jdtls = pcall(require,"jdtls")
  if not pkg_status then
    vim.notify("unable to load nvim-jdtls", "error")
    return {}
  end

  -- local jdtls_path = vim.fn.stdpath("data") .. "/mason/packages/jdtls"
  local jdtls_bin = vim.fn.stdpath("data") .. "/mason/bin/jdtls"

  local root_markers = { ".gradle", "gradlew", ".git" }
  local root_dir = jdtls.setup.find_root(root_markers)
  local home = os.getenv("HOME")
  local project_name = vim.fn.fnamemodify(root_dir, ":p:h:t")
  local workspace_dir = home .. "/.cache/jdtls/workspace/" .. project_name

  opts.cmd = {
    jdtls_bin,
    "-data",
    workspace_dir,
  }


  local on_attach = function(client, bufnr)
    jdtls.setup.add_commands() -- important to ensure you can update configs when build is updated
    -- if you setup DAP according to https://github.com/mfussenegger/nvim-jdtls#nvim-dap-configuration you can uncomment below
    -- jdtls.setup_dap({ hotcodereplace = "auto" })
    -- jdtls.dap.setup_dap_main_class_configs()

    -- you may want to also run your generic on_attach() function used by your LSP config
  end

  opts.on_attach = on_attach
  opts.capabilities = vim.lsp.protocol.make_client_capabilities()

  return opts
end

return { setup = setup }

这些示例是从我的个人 neovim 配置jdtls 配置)中提取的。希望这可以帮助您滚动。

还要确保您有可用于 jdtls 的 jdk17+(我启动 neovim,并将 JAVA_HOME 设置为我的 jdk17 安装) (你的代码仍然可以在 jdk8 上编译和运行——我成功地处理了用 jdk8 构建的 gradle 项目,这个配置没有问题)

© www.soinside.com 2019 - 2024. All rights reserved.