作为即将到来的 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
})
有人知道需要额外的配置吗?我没有看到任何特别指出的内容。
--- 配置编辑 ---
我更新了配置以调用 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 路径添加到
bashrc
文件中,并通过 Mason
重试安装
如果您在设置 mason/jdlts 时仍然遇到问题,请继续执行以下说明
按照其安装说明安装eclipse.jdt.ls。
添加插件: 插头
mfussenegger/nvim-jdtls
和 packer.nvim:mfussenegger/nvim-jdtls
使用以下代码在插件目录中创建您的个人
jdlts
配置文件。
获取新配置并打开任何 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 = {}
}
}
我建议使用 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 项目,这个配置没有问题)