第82章 Zed 编辑器中 Java 支持的安装与配置指南
Zed 中的 Java 语言支持由以下组件提供:
- Zed Java:zed-extensions/java
- Tree-sitter:tree-sitter/tree-sitter-java
- Language Server:eclipse-jdtls/eclipse.jdt.ls
安装 OpenJDK
需要安装 Java 运行时(OpenJDK)。
- macOS:
brew install openjdk - Ubuntu:
sudo add-apt-repository ppa:openjdk-23 && sudo apt-get install openjdk-23 - Windows:
choco install openjdk - Arch Linux:
sudo pacman -S jre-openjdk-headless
或者手动下载并安装 OpenJDK 23。
安装扩展
你可以打开 {#action zed::Extensions}({#kb zed::Extensions}) 并搜索 java 来安装。
快速上手与配置
对于大多数用户,Java 支持开箱即用。
-
通常建议将 Zed 项目根目录设置在 Java 项目根目录(即包含
pom.xml或build.gradle文件的位置)。 -
默认情况下,扩展会为你下载并运行最新版本的官方 JDTLS,这要求系统中可通过
$JAVA_HOME环境变量或$PATH中的java(.exe)可执行文件提供 Java 21。如果项目环境需要更低版本的 Java,可以通过java_home配置选项指定用于运行 JDTLS 的其他 JDK。 -
你可以为 JDTLS 提供< strong>自定义启动脚本:将一个名为
jdtls(Windows 上为jdtls.bat)的可执行文件添加到$PATH环境变量中。若该文件存在,扩展将跳过下载和启动托管实例,转而使用环境中的实例。 -
为了支持 Lombok,必须在启动 JDTLS 时下载 lombok-jar 并将其注册为 Java-Agent。默认情况下,扩展会自动处理此事;如果你不希望这样,可以将
lombok_support配置选项设为false。
以下是一个包含上述配置的常见 settings.json 示例:
{
"lsp": {
"jdtls": {
"settings": {
"java_home": "/path/to/your/JDK21+",
"lombok_support": true,
},
},
},
}
调试
调试功能通过我们的 Java Debug Fork 实现,扩展会自动下载并启动它。关于 Zed 中调试的工作原理,请参阅 Debugger 文档。
要开始调试 Java 项目,请在 Debug 菜单中点击 edit debug.json 按钮,并将文件内容替换为以下配置:
[
{
"adapter": "Java",
"request": "launch",
"label": "Launch Debugger",
// 如果你的项目有多个入口,请指定要使用的那个:
// "mainClass": "com.myorganization.myproject.MyMainClass",
//
// 相当于在程序入口处设置断点:
"stopOnEntry": true,
// 调试进程的工作目录
"cwd": "$ZED_WORKTREE_ROOT",
},
]
之后你就可以在 debug 菜单中选择"Launch Debugger"场景来启动新的调试会话了。
Windows 下的启动脚本(即 Tasks)
该扩展提供了在 Zed 内运行应用和测试的 Tasks——测试和入口点旁边会有小小的播放按钮。不过由于 Zed 扩展接口目前的限制,我们无法提供同时兼容 Maven 和 Gradle、且在 Windows 和 Unix 系统上都能运行的脚本,因此启动脚本默认只能在 Mac 和 Linux 上使用。
有一个比较简单的解决办法:提供你自己的 task 脚本即可让它在 Windows 上正常工作。具体做法请参见 这个 Issue,更多信息可阅读 Zed 文档中的 Tasks 部分。
高级配置 / JDTLS 初始化选项
JDTLS 提供了许多配置选项,可以通过 LSP 的 initialize 请求传入。该扩展会将你在设置中 lsp.jdtls.settings.initialization_options 下的 JSON 对象转发给 JDTLS。有关可用的选项和值,请参阅 JDTLS 配置 Wiki 页面。下面是一个 settings.json 示例,用于将上述 Wiki 页面中的示例配置转发给 JDTLS:
{
"lsp": {
"jdtls": {
"settings": {
// 这部分内容会作为 initializationOptions 发送给 JDTLS:
"initialization_options": {
"bundles": [],
// 如果 Zed 的项目根目录与 Java 项目根目录不一致,请使用此项:
"workspaceFolders": ["file:///home/snjeza/Project"],
"settings": {
"java": {
"home": "/usr/local/jdk-9.0.1",
"errors": {
"incompleteClasspath": {
"severity": "warning",
},
},
"configuration": {
"updateBuildConfiguration": "interactive",
"maven": {
"userSettings": null,
},
},
"import": {
"gradle": {
"enabled": true,
},
"maven": {
"enabled": true,
},
"exclusions": [
"**/node_modules/**",
"**/.metadata/**",
"**/archetype-resources/**",
"**/META-INF/maven/**",
"/**/test/**",
],
},
"referencesCodeLens": {
"enabled": false,
},
"signatureHelp": {
"enabled": false,
},
"implementationCodeLens": "all",
"format": {
"enabled": true,
},
"saveActions": {
"organizeImports": false,
},
"contentProvider": {
"preferred": null,
},
"autobuild": {
"enabled": false,
},
"completion": {
"favoriteStaticMembers": [
"org.junit.Assert.*",
"org.junit.Assume.*",
"org.junit.jupiter.api.Assertions.*",
"org.junit.jupiter.api.Assumptions.*",
"org.junit.jupiter.api.DynamicContainer.*",
"org.junit.jupiter.api.DynamicTest.*",
],
"importOrder": ["java", "javax", "com", "org"],
},
},
},
},
},
},
},
}