lazyvim折腾日记(9)
Lazyvim 折腾日记(9)
前言
突然间发现自己前一篇对于 lazyvim 里 java 语言的配置完全没有办法复现
我的意思是我在自己的 mac 相同的配置完全无法使用,不知道出现了什么奇怪的事情
遂重新对于 lazyvim 里的 java 配置进行补全,并想详细解释以下其中的原理
实际上我用的是 astronvim
知识点
- 详细解释关于
java的lsp以及debug的具体安装 - 结合
nvim-dap以及nvim-lspconfig配置java-debug以及java-lsp - 在
astronvim中该如何配置java以及astrocommunity中的问题
详细内容
具体的配置思路
ide 具体选择
为什么会选择 astronvim 而不是 lazyvim, 我个人感觉 astronvim 的配置更加的清晰一些
而 lazyvim 的配置更多的是很多的插件的堆积,实际使用下来加载了不少我并不需要的插件
对我自己而言,因为我是 nvim 新手,太多的插件堆积让我不知道该如何进行配置,故而选择更加轻量的 astronvim
其核心原因就是,astronvim 在兼具 lazyvim 易用性同时, 也保证了轻量化,所以弃暗投明使用 astronvim
关于 astrocommunity 的选择
在组件的使用上,lazyvim 使用 lazyextra 作为各个语言的插件集合,只需要勾选 extra 即可马上配置好一门语言
而对于 astronvim 则是是使用 astrocommunity 作为各个语言的插件集合
只需要在 astrolsp 中引入 astrocommunity 即可, 具体可以参考 astronvim java-nvim-jdtls
在本次的配置中,个人放弃使用 astrocommunity 而选择手动配置
其表现原因为直接引用 astrocommunity 中的 java-nvim-jdtls 无法生效,在查看了 astrocommunity 中的 java-nvim-jdtls 的配置后,发现其配置并不完全适合当前的环境
jdtls 需要 java17 的环境,而 astrocommunity 中的 java-nvim-jdtls 需要 java11 的环境
故而选择忽略 astrocommunity 中的 java-nvim-jdtls 进行手动配置
为何不直接使用 mason 安装 jdtls
还是同样的老问题,直接使用 mason 安装 jdtls 之后, 发现并不能够直接使用
在翻看 mason 的 jdtls-package.yml后,发现有可能是我的 $MASON 无法生效的原因??
也有可能是因为 mason 是直接下载的二进制文件,下载的二进制包无法使用的问题
故而选择从源码编译安装 jdtls
结论
在各种原因组合下,最终选择进行手动配置,这里就突出 astronvim 的易用性了,毕竟 astronvim 允许用户进行手动配置
前期环境准备以及理论知识准备
整体的配置思路可以参考 dart 安装日记
在这里再复述一遍,必要的是需要安装 cmp, dap, lsp,lint, 其中
cmp负责代码补全(需要各种代码片段)dap负责调试lsp负责语言服务器,也就是编译运行lint负责代码风格检查
相关的文档及原理请参考
在本文中
lsp, dap 我们使用手动安装
cmp, lint 我们使用 mason 进行安装
lsp 安装
选择哪个 lsp 进行安装
首先我们需要翻一翻 java 的 lsp 都有哪些
发现了两个 lsp 实现,分别是
这两个都是 lsp 的具体实现, 但是我们选择 jdtls, 原因在于
- 翻看前面的
astrocommunity, 发现astro官方选择jdtls作为 lsp java-language-server已经6个月没有更新了
所以我们选择 jdtls 作为我们的 lsp
安装 lsp
参考前面的 jdtls 文档,我们可以如此安装 jdtls
> j down //autojump 插件,跳转到 Downloads 文件夹
> git clone https://github.com/eclipse-jdtls/eclipse.jdt.ls.git
> jenv global 21 //全局应用 java21
> cd eclipse.jdt.ls.git
> ./mvnw clean verify -U -DskipTests=true //等待其编译完毕
> cd ..
> mv eclipse.jdt.ls.git ~/.local/opt // 我喜欢放在 local 下
> j opt //跳转到 opt 文件夹
> wget https://projectlombok.org/downloads/lombok-1.18.40.jar // 顺手把 lombok 下载了
> mkdir lombok
> mv lombok-1.18.40.jar lombok/lombok.jar
jdlts 即被我们编译完毕
相关的编译文件放在 ${安装路径}/org.eclipse.jdt.ls/org.eclipse.jdt.ls.product/target/repository/plugins 下
配置文件放在 ${安装路径}/org.eclipse.jdt.ls/org.eclipse.jdt.ls.product/target/repository/下
选择哪个 dap 进行安装
我们选择java-debug 作为我们的 dap, 原因如下
- 翻看
astrocommunity的配置,发现 dap 功能引用了一个叫java-debug-adapter的插件,翻看mason里java-debug-adapter指向的位置
即为java-debug - 翻看 dap-implementors, 指向debug-adapter-protocol,
而debug-adapter-protocol指向java-debug
故而选择 java-debug 作为我们的 dap
安装 dap
参考 java-debug 的文档,我们可以如此安装 java-debug
> j down
> git clone https://github.com/microsoft/java-debug.git
> cd java-debug
> ./mvnw clean install
> cd ..
> mv java-debug ~/.local/opt
具体的 dap 放在 ${安装路径}/java-debug/com.microsoft.java.debug.plugin/target/com.microsoft.java.debug.plugin-*.jar 下
配置 lsp 以及 dap
参考 astrocommunity 我们需要额外安装 nvim-jdtls
首先我们进入 astronvim 配置目录下的 plugins 文件夹,新建 java.lua 文件,
我们打算在这里配置 java
安装 nvim-jdtls
return{
{
"mfussenegger/nvim-jdtls",
lazy = false,
},
}
通过重启 nvim 等待 lazy 自动安装 nvim-jdtls
lsp 与 dap 配置
关于 jdtls 的配置我们参考 nvim-jdtls 的文档以及 astrocommunity 中的配置
- 配置 lsp 的位置
- 配置 lsp config 参数
- 配置 java workspace 位置(识别项目启动文件)
- 配置启动文件(读取到哪些文件自动启动 lsp)
- 配置 java 项目 cache 存储位置
- 配置 java 版本(如果你需要同时开发 java8 或者别的什么版本的 java 项目)
- 配置 lombok 支持
- 让 astrolsp 忽略 jdtls 的自动配置
- 让 jdtls 支持 dap
{
"mfussenegger/nvim-jdtls",
lazy = true,
ft = { "java" },
-- 配置 jdtls 依赖,以及不要让 astrolsp 自动配置 jdtls
dependencies = {
"williamboman/mason.nvim",
"neovim/nvim-lspconfig",
"williamboman/mason-lspconfig.nvim",
{
"AstroNvim/astrolsp",
optional = true,
---@type AstroLSPOpts
opts = {
setup_handlers = {
---@diagnostic disable:missing-fields
jdtls = false, -- disable jdtls in astrolsp
},
},
},
},
opts = function(_, opts)
local utils = require "astrocore"
local project_name = vim.fn.fnamemodify(vim.fn.getcwd(), ":p:h:t") -- 获取当前项目名称
local workspace_dir = vim.fn.stdpath "data" .. "/jdtls/workspace/" .. project_name -- 配置项目缓存存储位置(包含项目编译信息和临时文件等等)
vim.fn.mkdir(workspace_dir, "p") -- create workspace directory if it doesn't exist
-- todo:lsp 位置,记得修改
local jdtls_path = "/home/su/.local/opt/eclipse.jdt.ls/org.eclipse.jdt.ls.product/target/repository/" -- 定义 lsp 位置
return utils.extend_tbl(opts, {
-- 配置 lsp 启动参数
cmd = {
"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",
-- todo: lombok 位置,记得修改
"-javaagent:/home/su/.local/opt/lombok/lombok.jar",
"-Xms1g",
"--add-modules=ALL-SYSTEM",
"--add-opens",
"java.base/java.util=ALL-UNNAMED",
"--add-opens",
"java.base/java.lang=ALL-UNNAMED",
"-jar",
vim.fn.glob(jdtls_path .. "/plugins/org.eclipse.equinox.launcher_*.jar"),
"-configuration",
-- todo: 根据你的系统选择 config_linux 或者 config_win
jdtls_path .. "/config_linux",
"-data",
workspace_dir,
},
-- 配置项目启动文件识别
root_dir = require("jdtls.setup").find_root { ".git", "mvnw", "gradlew", "pom.xml", "build.gradle" },
-- 配置 Java 版本
settings = {
java = {
configuration = {
runtimes = {
{
name = "JavaSE-21",
path = "/home/su/.local/opt/jdk-21.0.6+7/",
},
},
},
},
},
-- 配置 dap 支持
init_options = {
bundles = {
-- todo: dap 位置,记得修改
vim.fn.glob "/home/su/.local/opt/java-debug/com.microsoft.java.debug.plugin/target/com.microsoft.java.debug.plugin-*.jar",
},
},
})
end,
config = function(_, opts)
-- require("jdtls").start_or_attach(opts)
vim.api.nvim_create_autocmd("Filetype", {
pattern = "java", -- autocmd to start jdtls
callback = function()
-- 配置 lsp 自动启动
if opts.root_dir and opts.root_dir ~= "" then
require("jdtls").start_or_attach(opts)
else
require("astrocore").notify("jdtls: root_dir not found, not starting jdtls", vim.log.levels.ERROR)
end
end,
})
end,
}
关于 astronvim 的配置方法可以参考 astronvim configuration
lint 以及 cmp 安装
我们需要安装 java 相关的 lint 以及 cmp 插件
我们首先需要下载 java 语法树
其次,我们需要安装 lint 以及 cmp 插件
{
"nvim-treesitter/nvim-treesitter",
optional = true,
-- 安装 Java 语法树
opts = function(_, opts)
if opts.ensure_installed ~= "all" then
-- 使用 list_insert_unique 来避免重复安装
opts.ensure_installed = require("astrocore").list_insert_unique(opts.ensure_installed, { "java" })
end
end,
},
{ "WhoIsSethDaniel/mason-tool-installer.nvim",
-- 安装 java 相关的 lint 以及 cmp 工具
optional = true,
opts = function(_, opts)
opts.ensure_installed = require("astrocore").list_insert_unique(
opts.ensure_installed,
{ "java-debug-adapter", "java-test", "ast-grep", "google-java-format", "vscode-java-decompiler" }
)
end,
},
总结
我们完成了 astronvim 中 java 语言的配置
其中,我们
- 对 lsp 以及 dap 的安装进行了详细的解释
- 结合 nvim-jdtls 配置了 lsp 以及 dap
- 结合 mason 以及 nvim-treesitter 安装了相关的 lint 以及 cmp 插件
通过本文,应该能够大致了解在 nvim 中配置一门语言的大致思路

浙公网安备 33010602011771号