lazyvim折腾日记(9)

Lazyvim 折腾日记(9)

前言

突然间发现自己前一篇对于 lazyvim 里 java 语言的配置完全没有办法复现

我的意思是我在自己的 mac 相同的配置完全无法使用,不知道出现了什么奇怪的事情

遂重新对于 lazyvim 里的 java 配置进行补全,并想详细解释以下其中的原理

实际上我用的是 astronvim

知识点

  1. 详细解释关于 javalsp 以及 debug 的具体安装
  2. 结合 nvim-dap 以及 nvim-lspconfig 配置 java-debug 以及 java-lsp
  3. 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 之后, 发现并不能够直接使用

在翻看 masonjdtls-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, 原因在于

  1. 翻看前面的 astrocommunity, 发现 astro 官方选择 jdtls 作为 lsp
  2. 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, 原因如下

  1. 翻看 astrocommunity 的配置,发现 dap 功能引用了一个叫 java-debug-adapter 的插件,翻看 masonjava-debug-adapter 指向的位置
    即为 java-debug
  2. 翻看 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 中的配置

  1. 配置 lsp 的位置
  2. 配置 lsp config 参数
  3. 配置 java workspace 位置(识别项目启动文件)
  4. 配置启动文件(读取到哪些文件自动启动 lsp)
  5. 配置 java 项目 cache 存储位置
  6. 配置 java 版本(如果你需要同时开发 java8 或者别的什么版本的 java 项目)
  7. 配置 lombok 支持
  8. 让 astrolsp 忽略 jdtls 的自动配置
  9. 让 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,
  },

总结

我们完成了 astronvimjava 语言的配置

其中,我们

  1. 对 lsp 以及 dap 的安装进行了详细的解释
  2. 结合 nvim-jdtls 配置了 lsp 以及 dap
  3. 结合 mason 以及 nvim-treesitter 安装了相关的 lint 以及 cmp 插件

通过本文,应该能够大致了解在 nvim 中配置一门语言的大致思路

posted @ 2025-12-01 00:32  五花肉炒河粉  阅读(41)  评论(0)    收藏  举报