lsp-java
使用 Eclipse JDT Language Server 的 Emacs Java IDE。
要求
- JDK 17
功能
LSP java 模式支持以下 JDT 功能:
- 输入时报告解析和编译错误(通过 flycheck/lsp-ui)
- 代码补全 - 使用 company-capf 或内置
complete-at-point - Javadoc 悬停 - 使用 lsp-ui
- 代码操作 - 使用 lsp-ui
- 代码大纲 - 使用内置 imenu
- 代码导航 - 使用内置 xref
- 代码透镜(引用/实现) - 使用内置 xref
- 高亮显示
- 代码格式化
- Maven pom.xml 项目支持
- 有限的 Gradle 支持
- 可视化调试器 - dap-mode
- 测试运行器 - dap-mode
- 项目资源管理器集成 - treemacs
- 与 Spring Initializr 集成
演示
这是来自 EmacsConf2019 的演示 https://www.youtube.com/watch?v=Bbjxn9yVNJ8
教程
这是一个涵盖设置和使用的教程 https://xpressrazor.wordpress.com/2020/11/04/java-programming-in-emacs/
截图

安装
Spacemacs
lsp-java 包含在 spacemacs 中(目前仅在 dev 分支上)。如果你使用的是
spacemacs 的开发版本,你可以简单地将 (java :variables java-backend 'lsp) 添加到 dotspacemacs-configuration-layers。
通过 melpa 安装
安装 LSP Java 的推荐方式是通过 package.el - Emacs 内置的包
管理器。LSP Java 在两个主要的由 package.el 社区
维护的仓库上可用 - MELPA Stable 和 MELPA。
M-x package-install [RET] lsp-java [RET]
然后在你的 .emacs 中添加以下行,并从指定的任一项目中打开一个文件。
(require 'lsp-java)
(add-hook 'java-mode-hook #'lsp)
Eclipse JDT Language Server
lsp-java 会自动检测服务器是否缺失,并在首次启动前下载 Eclipse JDT Language Server。服务器安装位置为 lsp-java-server-install-dir。它会检测是否存在 dap-mode,并下载所需的服务器端插件/组件。如果你想更新服务器,可以运行 lsp-java-update-server。要运行特定版本的 Eclipse JDT Language Server,请使用 lsp-java-server-install-dir。
快速入门
使用 company-capf、lsp-ui 和 dap-mode 的最小配置。如果你有现有的 Java 项目,请设置 lsp-java-workspace-dir。现在你可以探索 lsp-java-*、dap-java-*、dap-* 和 lsp-* 下的方法。
(condition-case nil
(require 'use-package)
(file-error
(require 'package)
(add-to-list 'package-archives '("melpa" . "http://melpa.org/packages/"))
(package-initialize)
(package-refresh-contents)
(package-install 'use-package)
(setq use-package-always-ensure t)
(require 'use-package)))
(use-package projectile)
(use-package flycheck)
(use-package yasnippet :config (yas-global-mode))
(use-package lsp-mode :hook ((lsp-mode . lsp-enable-which-key-integration)))
(use-package hydra)
(use-package company)
(use-package lsp-ui)
(use-package which-key :config (which-key-mode))
(use-package lsp-java :config (add-hook 'java-mode-hook 'lsp))
(use-package dap-mode :after lsp-mode :config (dap-auto-configure-mode))
(use-package dap-java :ensure nil)
(use-package helm-lsp)
(use-package helm
:config (helm-mode))
(use-package lsp-treemacs)
支持的命令
LSP 模式命令
lsp-execute-code-action- 执行代码操作。lsp-rename- 重命名光标处的符号lsp-describe-thing-at-point- 显示光标处内容的帮助。lsp-goto-type-definition- 跳转到类型定义lsp-goto-implementation- 跳转到实现lsp-restart-workspace- 重启项目lsp-format-buffer- 格式化当前缓冲区lsp-symbol-highlight- 高亮显示光标下符号的所有相关引用。lsp-workspace-folders-add- 添加工作区文件夹lsp-workspace-folders-remove- 移除工作区文件夹lsp-workspace-folders-switch- 切换工作区文件夹
LSP Java 命令
lsp-java-organize-imports- 整理导入lsp-java-build-project- 对项目执行部分或完整构建lsp-java-update-project-configuration- 更新项目配置lsp-java-actionable-notifications- 解决可操作的通知lsp-java-update-user-settings- 更新用户设置(请检查下表中的选项。)lsp-java-update-server- 更新服务器安装。lsp-java-generate-to-string- 生成toString方法。lsp-java-generate-equals-and-hash-code- 生成equals和hashCode方法。lsp-java-generate-overrides- 生成方法overrideslsp-java-generate-getters-and-setters- 生成 getter 和 setter。lsp-java-type-hierarchy- 打开类型层次结构。使用前缀参数指定层次结构的类型。
重构
LSP Java 通过 Eclipse JDT Language Server 代码操作提供了丰富的重构功能, 其中一些已绑定到 Emacs 命令:
lsp-java-extract-to-constant- 提取常量重构lsp-java-add-unimplemented-methods- 提取常量重构lsp-java-create-parameter- 创建参数重构lsp-java-create-field- 创建字段重构lsp-java-create-local- 创建局部变量重构lsp-java-extract-method- 提取方法重构lsp-java-add-import- 添加缺失的导入
测试支持
lsp-jt-browser- 浏览测试并运行/调试它们。 ** 使用x运行光标下的测试;使用d调试光标下的测试。使用R刷新。 ** 支持 GUI 操作。lsp-jt-report-open- 打开测试报告lsp-jt-lens-mode- 测试透镜模式(需要启用lsp-lens-mode。)
依赖项查看器
lsp-java-dependency-list- 查看 Java 依赖项
STS4 集成(实验性)
LSP java 与 STS4 集成,提供以下功能。
Spring Boot 支持(实验性)
除了与 Eclipse JDT Language Server 集成外,lsp-java 还提供与 STS4 的集成,涵盖 Spring Boot
application.properties、application.yml 和 .java 文件。
用法:
请确保已配置 JAVA_HOME。调用 lsp-java-update-server 时,lsp-java 将自动下载 STS4。要启用 STS4 集成,请在配置中添加以下行:
(require 'lsp-java-boot)
;; to enable the lenses
(add-hook 'lsp-mode-hook #'lsp-lens-mode)
(add-hook 'java-mode-hook #'lsp-java-boot-lens-mode)
.java 的功能
导航源代码 - 转到文件/工作区中的符号
轻松导航到源代码中的 Spring 特定元素。

命令
lsp-workspace-symbol - (使用 helm-lsp 效果更佳)
示例
@/显示所有已定义的请求映射(映射路径、请求方法、源代码位置)@+显示所有已定义的 Bean(Bean 名称、Bean 类型、源代码位置)@>显示所有函数(原型实现)@显示代码中所有 Spring 注解
运行中应用的快速访问
快速导航到运行中应用提供的请求映射。

命令
lsp-workspace-symbol - (使用 helm-lsp 效果更佳)
示例
//显示所有正在运行的 Spring Boot 应用的所有请求映射,并为所选端点打开浏览器
实时应用信息悬停
STS4 会自动检测本地机器上正在运行的 Boot 应用的 JVM 进程。
对于某些类型的信息,STS 4 也可能以代码透镜(codelens)的形式显示“快速摘要”。
如果您的机器上正在运行多个应用实例,则所有这些实例的实时数据都会显示在悬停信息中。
(add-hook 'java-mode-hook #'lsp-java-boot-lens-mode)

示例
@Profile:显示正在运行的应用程序上活动配置文件的信息@Component、@Bean、@Autowired:显示来自实时应用程序的 Bean 及其装配的详细信息@ContidionalOn...:显示运行时条件及其评估的信息
代码模板
使用模板编写 Spring 代码,可通过常规代码补全访问。
示例
@GetMapping@PostMapping@PutMapping
智能代码补全
针对 Spring 特定注解的额外代码补全

.properties 和 .yml 的功能
此扩展会分析项目的类路径,并解析和索引其找到的任何 Spring Boot Properties Metadata。同时支持 Maven 和 Gradle 项目。
索引中的数据用于在编辑 .properties 或 .yml 格式的 Spring Boot Properties 时提供验证、代码补全和信息悬停。
properties 文件中的验证和代码补全

yaml 文件中的验证和代码补全

Spring Initializr
lsp-java 为 Spring Initializr 提供了一个前端,可通过 lsp-java-spring-initializr 直接从 Emacs 创建 Spring Boot 项目。

支持的设置
lsp-java-server-install-dir- "eclipse.jdt.ls-server 的安装目录。 末尾应包含斜杠。"lsp-java-jdt-download-url- JDT JS 下载 URL。 如果希望使用 Eclipse Che JDT LS,请使用 http://download.eclipse.org/che/che-ls-jdt/snapshots/che-jdt-language-server-latest.tar.gz。lsp-java-java-path- java 可执行文件的路径。lsp-java-progress-string- 由语言服务器报告的 Java 进度状态。lsp-java-workspace-dir- LSP java 工作区目录。lsp-java-workspace-cache-dir- LSP java 工作区缓存目录。lsp-java-themes-directory- 包含主题的目录。lsp-java-theme- 要使用的主题。lsp-java-pop-buffer-function- 用于显示辅助窗口的函数。lsp-java-vmargs- 指定用于启动 Java Language Server 的额外 VM 参数。例如,使用-noverify -Xmx1G -XX:+UseG1GC -XX:+UseStringDeduplication以绕过类验证,将堆大小增加到 1GB,并启用 G1 垃圾回收器的 String 去重lsp-java-9-args- 指定特定于 java 9 及更高版本的参数。lsp-java-errors-incomplete-classpath-severity- 指定当 Java 文件的类路径不完整时消息的严重性lsp-java-configuration-check-project-settings-exclusions- 检查是否应从文件资源管理器中排除扩展生成的项目设置文件(.project, .classpath, .factorypath, .settings/)。lsp-java-configuration-update-build-configuration- 指定构建文件上的修改如何更新 Java 类路径/配置lsp-java-trace-server- 跟踪 VS Code 与 Java 语言服务器之间的通信。lsp-java-import-gradle-enabled- 启用/禁用 Gradle 导入器。lsp-java-import-maven-enabled- 启用/禁用 Maven 导入器。lsp-java-maven-download-sources- 启用/禁用 Maven 源工件的急切下载。lsp-java-references-code-lens-enabled- 启用/禁用引用代码透镜。lsp-java-signature-help-enabled- 启用/禁用签名帮助。lsp-java-implementations-code-lens-enabled- 启用/禁用实现代码透镜。lsp-java-configuration-maven-user-settings- Maven 的 settings.xml 路径lsp-java-format-enabled- 启用/禁用默认 Java 格式化器lsp-java-save-actions-organize-imports- 启用/禁用保存操作时自动整理导入lsp-java-import-exclusions- 配置用于排除文件夹的 glob 模式lsp-java-content-provider-preferred- 首选内容提供程序(通常是第三方反编译器 ID)。我们支持 https://github.com/dgileadi/vscode-java-decompiler。要启用它,请添加:(setq lsp-java-content-provider-preferred "fernflower")lsp-java-autobuild-enabled- 启用/禁用“自动构建”lsp-java-max-concurrent-builds- 最大同时项目构建数lsp-java-completion-enabled- 启用/禁用代码补全支持lsp-java-completion-overwrite- 当设置为 true 时,代码补全会覆盖当前文本。当设置为 false 时,代码只是简单地添加进去。lsp-java-completion-guess-method-arguments- 当设置为 true 时,当从代码辅助建议列表中选择一个方法时,会猜测方法参数。lsp-java-completion-favorite-static-members- 定义静态成员或具有静态成员的类型的列表。即使缺少导入,内容辅助也会建议这些静态成员。lsp-java-completion-import-order- 定义导入语句的排序顺序。包或类型名称前缀(例如 'org.eclipse')是有效条目。导入总是被添加到最具体的组中。lsp-java-folding-range-enabled- 启用/禁用智能折叠范围支持。如果禁用,将使用 VS Code 提供的基于缩进的默认折叠范围。indentation-based- [实验性] 启用/禁用来自服务器后台进程的进度报告。lsp-java-progress-reports-enabled- [实验性] 启用/禁用来自服务器后台进程的进度报告。lsp-java-format-settings-url- 指定 Eclipse formatter xml settings 的 url 或文件路径。lsp-java-format-settings-profile- 来自 Eclipse formatter 设置的可选格式化配置文件名称。lsp-java-format-comments-enabled- 在代码格式化期间包含注释。lsp-java-format-on-type-enabled- 在输入;、<enter>或}时启用/禁用自动块格式化lsp-java-bundles- 将在 JDT 服务器中加载的捆绑包列表。lsp-java-code-generation-hash-code-equals-use-java7objects- 在生成 hashCode 和 equals 方法时使用 Objects.hash 和 Objects.equals。此设置仅适用于 Java 7 及更高版本。lsp-java-code-generation-hash-code-equals-use-instanceof- 在生成 hashCode 和 equals 方法时使用 'instanceof' 来比较类型。lsp-java-code-generation-use-blocks- 在生成方法时,在 'if' 语句中使用代码块。lsp-java-code-generation-generate-comments- 在生成方法时生成方法注释。lsp-java-code-generation-to-string-template- 生成 toString 方法的模板。lsp-java-code-generation-to-string-code-style- 生成 toString 方法的代码风格。lsp-java-code-generation-to-string-skip-null-values- 在生成 toString 方法时跳过 null 值。lsp-java-code-generation-to-string-list-array-contents- 列出数组内容,而不是使用原生 toString()。lsp-java-code-generation-to-string-limit-elements- 限制数组/集合/映射中列出的项目数量,如果为 0 则列出所有。lsp-java-inhibit-message- 如果非 nil,则通过 `inhibit-message' 抑制 java 消息回显。lsp-java-sources-organize-imports-star-threshold- 指定在使用星号导入声明之前添加的导入数量。lsp-java-sources-organize-imports-static-star-threshold- 指定在使用星号导入声明之前添加的静态导入数量。
附加包
- lsp-ui : Flycheck、文档和代码操作支持。
- company-capf : Company 后端支持。
- treemacs : 项目查看器。
- lsp-treemacs : 使用 treemacs 实现的
lsp-modeGUI 控件。
常见问题
- LSP Java 显示了过多的调试消息,如何停止? 添加以下配置。
(setq lsp-inhibit-message t)
- lsp-ui 未显示当前点的所有操作(例如 "Extract constant")? LSP UI 默认发送当前行的边界作为操作区域,这会导致 JDT 服务器仅返回 "Extract method action."。
(setq lsp-ui-sideline-update-mode 'point)
- LSP Java 未为某些文件提供补全和跳转到定义功能?
当特定文件不属于已导入的项目时,Eclipse JDT Language Server 无法计算当前的类路径。
- 如何更改 LSP 使用的 java 版本?
请查看 ~/.emacs.d/workspace/.metadata/.plugins/org.eclipse.jdt.launching/libraryInfos.xml。如果您更新了本地 java 路径并希望 LSP 使用新版本,请尝试删除 ~/.emacs.d/workspace/ 目录并重新启动 LSP。另请参阅 #114。
如果您安装了多个 java JDK 版本并希望更改 LSP 使用的 java 版本,还需要设置 lsp-java-configuration-runtimes。设置 lsp-java-configuration-runtimes 的示例:
(setq lsp-java-configuration-runtimes '[(:name "JavaSE-1.8"
:path "/home/kyoncho/jdk1.8.0_201.jdk/")
(:name "JavaSE-11"
:path "/home/kyoncho/jdk-11.0.1.jdk/"
:default t)])
- 如何更改传递给 JDT server 的 JVM 参数? LSP 的缓慢可能由 JDT server 响应慢引起,尤其是在大型 JAVA 项目中。增加堆大小可能是一个好主意。
;; current VSCode defaults
(setq lsp-java-vmargs '("-XX:+UseParallelGC" "-XX:GCTimeRatio=4" "-XX:AdaptiveSizePolicyWeight=90" "-Dsun.zip.disableMemoryMapping=true" "-Xmx2G" "-Xms100m"))
- 我已在 VSCode 中配置好所有内容,并将代码工作区保存在那里,可以导入吗?
是的,命令 lsp-java-load-vscode-workspace 允许你加载在 VScode 中创建的 code-workspace 文件。
它还会从 VSCode 设置中导入 Java 运行时和 Debug 启动配置。