语言服务器
备选服务器只在排在它前面的服务器未安装时才会启动。想手动指定,打开 设置 › 语言和框架 › 语言服务器,选中其中一个服务器,在 Java 语言服务器(或 Kotlin 语言服务器)里选择:自动 使用第一个可用的,无 关闭代码智能。这个选择可以全局生效,也可以只对当前项目生效。
kmp-lsp 不运行 JVM,提供基于语法的 Java 代码智能,没有 JDT 的编译分析、Lombok 支持和 JDT 的重构。构建和运行 Java “应用程序”配置、类路径发现以及 Java 调试器都需要 jdtls。
随 IDE 提供的部分
在原版 jdtls 之上,OpenIDEA 会加载仓库java/ 目录里的扩展 bundle:
- java-usages:查找用法能区分读和写;对字段,还会一并找出它的 getter、setter 和 builder(包括 Lombok 生成的)。查找用法默认只搜项目源码(项目文件),选择 项目和库 时才会搜索依赖 jar。
- Spring 配置导航:见 Spring。
- kotlin-bridge:在 Java 与 Kotlin 混合的 Maven 项目里,让 Java 代码能看到 Kotlin 类。见下文“Maven 项目中的 Kotlin”。
- Lombok:应用内置一个打过补丁的 Lombok agent(1.18.48,修复了在当前 JDT LS 上的问题),无需下载。
jdt:// 文档打开。依赖有源码包时,jdtls 会下载 Maven 和 Eclipse 源码。
环境配置
安装服务器
打开 Java 或 Kotlin 文件时,如果对应的服务器缺失,会弹出通知并提供 安装 按钮。也可以在 设置 › 语言和框架 › 语言服务器 里安装、重新安装或卸载每个工具。所有工具都装进 IDE 自己的工具目录,不需要管理员权限:PATH 上已有的 jdtls(Homebrew、Scoop 或 release 压缩包)也能直接用。OpenIDEA 直接在 JVM 上启动它,不经过它自带的 Python 启动脚本,所以不需要装 Python。没装 java-debug 就开始调试时,IDE 会提示安装,并带着这个 bundle 重启 jdtls。
Groovy 没有安装程序:需要自行构建 groovy-language-server,以 groovy-language-server 的名字放到 PATH 上,或在 语言服务器 页面里指定可执行文件。
JDK 检测
OpenIDEA 会在这些位置查找已安装的 JDK:JAVA_HOME、PATH 上的 java、/Library/Java/JavaVirtualMachines(系统级和用户级)、/usr/lib/jvm、Homebrew、SDKMAN、mise、asdf、~/.jdks,以及 Windows 上 Program Files 下常见的厂商目录。IDE 自己下载的 JDK 也会被找到。JDK 列表旁的 重新检测 可以重新扫描。
设置 › 语言和框架 › Java 里有两项 JDK 设置:
- 项目 JDK › SDK:用于编译和运行项目。它是 jdtls 的默认运行时、运行/调试使用的 JDK,也是 Maven 和 Gradle 的
JAVA_HOME。选 自动 时,每个模块使用与其目标 Java 版本匹配的已安装 JDK。 - 语言服务器 › JDK:只用来运行 jdtls,因此 Java 8 或 17 的项目也能用上新版 jdtls。选 自动 时,项目 JDK 版本够新就用它,否则用第一个满足要求的已安装 JDK;一个都没有时,会自动下载 Eclipse Temurin 到单独的语言服务器运行时目录。
JavaSE-17、JavaSE-21……)注册给 jdtls,所以目标是 Java 17 的模块会针对 JDK 17 编译,而不是针对运行 jdtls 的那个 JDK。
语言级别 在构建文件没有指定时决定 Java 源码和字节码级别。每个 JDK 列表里都有 下载 JDK…,可以选择版本,把 Eclipse Temurin 下载到 IDE 的 JDK 目录。当 jdtls、某个运行配置或 Maven/Gradle 同步找不到足够新的 JDK 时,也会提示同样的下载。
Kotlin Language Server(fwcd)最高只能在 Java 21 上运行。如果 JAVA_HOME 指向更新的 JDK,IDE 会改用已安装 JDK 中符合要求的最新版本来启动它。
内存与 JVM 选项
每个项目窗口各自启动一个 jdtls,有独立的工作区和索引。jdtls 默认使用以下 JVM 选项:-Xmx1g 或 -Xmx4g。你设置的选项会替换同一项的默认值;指定其他回收器(如 -XX:+UseZGC)时,默认的回收器相关选项会全部去掉。该设置可以全局配置,也可以按项目配置。
在构建间共享 JDT LS 让一个本地项目窗口里所有关联的构建共用一个 jdtls,而不是每个构建一个。不同项目窗口之间仍然是各自独立的进程。
jdtls 的工作区保存在 IDE 的数据目录(lsp/jdtls/)中,不在项目里;jdtls 也不会往项目里写 .project、.classpath 或 .settings。见数据目录与日志。
Lombok
项目用到 Lombok 时(在构建文件、继承的父 POM 或 Gradle 构建中声明,或源码里有相关 import),OpenIDEA 会给 jdtls 加上 Lombok agent。默认使用 语言服务器 页面里的那个,也就是内置的版本;没有时会退回到 Maven 或 Gradle 缓存里最新的 Lombok。你在 JVM 选项 里自己写的-javaagent 优先。项目自身的 Lombok 依赖不会被改动。
构建工具
jdtls 会自动导入 Maven 和 Gradle 项目(包括 Gradle wrapper)。没有构建文件的目录会作为普通 Java 项目打开,lib/ 下的 jar 会加入类路径。OpenIDEA 还提供 Maven 和 Gradle 工具窗口,用来执行目标和任务、重新加载、切换 profile 以及分析依赖。相关设置在 设置 › 构建、执行、部署 › Maven 和 Gradle:
- Maven:JRE、Maven 主路径(默认用项目的
mvnw,没有则用PATH上的mvn)、用户设置文件、Toolchains 文件、本地仓库、活动 profiles、线程数 和 使用 Maven Daemon (mvnd)。在 Maven 工具窗口里选的 profile 也会传给 jdtls,编辑器看到的依赖与该 profile 一致。 - Gradle:构建和运行使用(Gradle 或 OpenIDEA)、Gradle 使用的 JVM、分发(Gradle 包装器或本地安装)、Gradle 主路径 和 Gradle 用户主目录。
Maven 项目中的 Kotlin
在含 Kotlin 源码的 Maven 项目里,每次保存后 OpenIDEA 会在后台用项目自己的 Maven 配置构建 Kotlin 代码,输出到一个私有目录,再把编译好的 Kotlin 类作为库交给 jdtls。这样同一模块或其他模块的 Java 代码就能调用 Kotlin 代码。这次构建的错误会以kotlin-bridge 的名义出现在 问题 中;在下一次构建成功之前,继续使用上一次成功的结果。这个桥接只覆盖编译后的 Kotlin API,从 Java 跳转到 Kotlin 源码、分析未保存的 Kotlin 修改以及跨语言重构都不在其中。
运行与测试
main 方法、测试类和测试方法旁的边栏图标会创建这些配置;Maven 和 Gradle 的运行配置会从构建文件中自动检测。对 Gradle 项目,构建和运行使用 决定“应用程序”是作为 Gradle 的
JavaExec 任务运行(默认),还是由 OpenIDEA 用 jdtls 给出的类路径直接启动。
测试结果从 Maven 和 Gradle 生成的 JUnit XML 报告中读取,通过的测试也会列出;测试树支持只重跑失败的测试。Gradle 运行配置的 VM 选项会作用到 Gradle fork 出来的 JVM(run、bootRun、test)。类路径超出命令行长度限制时(Windows 上常见),会改用参数文件或只含 manifest 的 jar。
另见运行配置和测试。
调试
Java 调试使用 jdtls 内的 Microsoft java-debug,Kotlin 调试使用 Kotlin Debug Adapter。可以调试:- “应用程序”、Spring Boot、“JAR 应用程序”和“Tomcat 服务器”配置。
- 会启动 JVM 的 Maven 和 Gradle 配置(测试、
spring-boot:run、bootRun、run):IDE 会加上 JDWP agent,等 JVM 就绪后自动附加,输出和测试树仍留在运行工具窗口里。 - 在别处启动的进程:使用 远程 JVM 调试 配置。
⌘F10 / Ctrl+F10),行为由 执行“更新”操作时 选项决定。
另见调试。
框架支持
Spring
- Spring Boot 运行配置:根据
@SpringBootApplication类创建,默认显示在 服务 工具窗口中。 - 配置导航:在
application.yml或.properties的键上转到定义,会打开绑定到它的 Java 成员(@ConfigurationProperties、@Value、Environment.getProperty);反过来,从 Java、YAML、properties 或 Spring XML 里的${…}占位符也能跳到配置键。依赖中spring-configuration-metadata.json描述的键会跳到对应的源类。对配置键执行 查找用法,会同时列出配置声明和 Java 中的使用处。 - Spring Web 端点:Java 和 Kotlin 控制器中的请求映射旁有边栏图标,还有 在 HTTP 客户端中生成请求 和 为控制器生成请求 两个操作,会把请求写进一个临时
.http文件。随处搜索的 全部 标签页可以按请求路径搜索。见 HTTP Client。 - Facet:在 项目结构(
⌘;/Ctrl+Alt+Shift+S)里记录模块使用的框架(Web、Spring、JPA)。添加 Web Facet 还会把其中的WEB-INF/lib/*.jar加入 jdtls 的类路径。
MyBatis
MyBatis mapper 接口与 XML 语句之间的跳转由 MyBatis Navigator 插件(plugins/official/mybatis)提供,不属于 IDE 本体。
已知限制
- 每个项目窗口运行一个 jdtls,同时打开多个大项目时内存会叠加。可以在 JVM 选项 中调低
-Xmx,或关闭暂时不用的窗口。在构建间共享 JDT LS 只在单个窗口内有效。 - 没有 jdtls 时(例如只用
kmp-lsp),“应用程序”配置、依赖类路径的功能和 Java 调试都不可用。 - Java 测试通过 Maven 或 Gradle 运行,两者都没有的项目没有测试运行器。
- Kotlin 桥接只支持 Maven,只把编译后的 Kotlin 类暴露给 Java,不提供从 Java 到 Kotlin 源码的跳转或重构。
- Groovy 需要自行构建
groovy-language-server,JSP 只有语法高亮。