ITADN
emacs-lsp/lsp-java
emacs-lsp/lsp-java · 文件 下载 ZIP
文件最后提交记录最后更新时间
README.md
以下内容由 AI 翻译,如有问题请点此提交 issue 反馈

MELPA MELPA Stable CI Join the chat at https://gitter.im/emacs-lsp/lsp-mode

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/

截图

demo

安装

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 StableMELPA

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-capflsp-uidap-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 - 生成 equalshashCode 方法。
  • lsp-java-generate-overrides - 生成方法 overrides
  • lsp-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.propertiesapplication.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 特定元素。

Go to Symbol in workspace

命令

lsp-workspace-symbol - (使用 helm-lsp 效果更佳)

示例

  • @/ 显示所有已定义的请求映射(映射路径、请求方法、源代码位置)
  • @+ 显示所有已定义的 Bean(Bean 名称、Bean 类型、源代码位置)
  • @> 显示所有函数(原型实现)
  • @ 显示代码中所有 Spring 注解

运行中应用的快速访问

快速导航到运行中应用提供的请求映射。

accessing running apps quickly

命令

lsp-workspace-symbol - (使用 helm-lsp 效果更佳)

示例

  • // 显示所有正在运行的 Spring Boot 应用的所有请求映射,并为所选端点打开浏览器

实时应用信息悬停

STS4 会自动检测本地机器上正在运行的 Boot 应用的 JVM 进程。

对于某些类型的信息,STS 4 也可能以代码透镜(codelens)的形式显示“快速摘要”。

如果您的机器上正在运行多个应用实例,则所有这些实例的实时数据都会显示在悬停信息中。

(add-hook 'java-mode-hook #'lsp-java-boot-lens-mode)

live data from running apps as hover on source code

示例

  • @Profile:显示正在运行的应用程序上活动配置文件的信息
  • @Component@Bean@Autowired:显示来自实时应用程序的 Bean 及其装配的详细信息
  • @ContidionalOn...:显示运行时条件及其评估的信息

代码模板

使用模板编写 Spring 代码,可通过常规代码补全访问。

示例

  • @GetMapping
  • @PostMapping
  • @PutMapping

智能代码补全

针对 Spring 特定注解的额外代码补全

Smart code completion for boot properties

.properties.yml 的功能

此扩展会分析项目的类路径,并解析和索引其找到的任何 Spring Boot Properties Metadata。同时支持 Maven 和 Gradle 项目。

索引中的数据用于在编辑 .properties.yml 格式的 Spring Boot Properties 时提供验证、代码补全和信息悬停。

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

application-properties-validation

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

application-properties-validation

Spring Initializr

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

支持的设置

  • 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 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 启动配置。