Skip to content

Eclipse JDT Language Server

Desmond Deng edited this page Sep 8, 2023 · 8 revisions

快速开始

环境准备

  1. 下载Eclipse JDT LS。例如:我下载的目录是/home/archer/.cache/jdt-language-server-latest

  2. jdtls命令加入环境变量,jdtls命令位于下载的Eclipse JDT LS目录的bin目录下。例如: 我的是在/home/archer/.cache/jdt-language-server-latest/bin

  3. 运行 jdtls -h,确保jdtls命令在全局可找到。

jdtls -h
usage: jdtls [-h] [--validate-java-version | --no-validate-java-version] [--jvm-arg JVM_ARG]

options:
  -h, --help            show this help message and exit  
  --validate-java-version, --no-validate-java-version
  --jvm-arg JVM_ARG     An additional JVM option (can be used multiple times. Note, use with equal sign.
                        For example: --jvm-arg=-Dlog.level=ALL

配置

  (require 'lsp-bridge-jdtls) ;; 根据项目自动生成自定义配置,添加必要的启动参数
  (setq lsp-bridge-enable-auto-import t) ;; 开启自动导入依赖,目前没有code action。补全时可以通过这个导入相应的依赖,建议开启。

lombok配置

将lombok的路径加入到lsp-bridge-jdtls-jvm-args参数中,在生成配置时会加入到command参数中。 例如:

  (setq lsp-bridge-jdtls-jvm-args '("-javaagent:/home/archer/.m2/repository/org/projectlombok/lombok/1.18.22/lombok-1.18.22.jar"))

注意:如果项目配置已经生成,那么新加入的lsp-bridge-jdtls-jvm-args参数将不会生效,需要删除旧的配置或手动加入已经生成的配置文件中。 默认配置文件位置是: ~/.cache/lsp-bridge-jdtls/${porject-name}-${project-path-hash}/jdtls.json 修改或删除即可。

多个项目的Java workspace配置

通过lsp-bridge-get-workspace-folder可以支持在一个workspace目录下的多个项目。以下是一个例子。issue 323有更多的细节。

(defun my-lsp-bridge-workspace (proj)
  (let* ((proj-2-workspace
          '(("/home/user/projects/workspace1/proj1" .
             "file:///home/user/projects/workspace1/")
            ("/home/user/projects/workspace2/proj2" .
             "file:///home/user/projects/workspace2/")))
         (kv (assoc proj proj-2-workspace)))
    (when kv
        (cdr kv))))

(custom-set-variables '(lsp-bridge-get-workspace-folder 'my-lsp-bridge-workspace))

其他

为什么需要 (require 'lsp-bridge-jdtls)

因为jdtls要求每个项目需要指定一个唯一的数据目录,也就是启动命令中的-data参数。

但是默认的langserver/jdtls.json是不支持根据项目指定-data参数,所以lsp-bridge-jdtls.el主要的作用是动态的指定一些用户相关的配置,让jdtls能拿到正确的启动参数。

当你(require 'lsp-bridge-jdtls)后,他会在java-mode-hook中添加lsp-bridge-get-lang-server-by-project的实现来自定义语言服务器配置

(add-hook 'java-mode-hook (lambda ()
                            (setq-local lsp-bridge-get-lang-server-by-project 'lsp-bridge-get-jdtls-server-by-project)))

注意:如果使用use-package来按需加载包,(require 'lsp-bridge-jdtls) 需要写在:init部分 确保正确执行hook