Ubuntu 22.04 + VS Code 安装 Java 21 开发环境指南
在 Ubuntu 22.04 + VS Code 上把 Spring Boot 项目跑起来,需要装:JDK 21、Maven、VS Code 的 Java 扩展包。下面按顺序来。
一、安装 JDK 21
Ubuntu 22.04 官方仓库自带的 JDK 版本较老(一般是 11 或 17),装 21 推荐用 SDKMAN(版本管理灵活)或者直接装 Ubuntu 22.04 的 OpenJDK 21 包(较新 Ubuntu 已回填支持)。两种方式任选一种:
方式 A:SDKMAN(推荐,方便以后切换多个 JDK 版本)
# 安装 SDKMAN
curl -s "https://get.sdkman.io" | bash
source "$HOME/.sdkman/bin/sdkman-init.sh"
# 查看可用的 21 版本
sdk list java | grep 21
# 安装 Eclipse Temurin 21(社区常用的 OpenJDK 发行版)
sdk install java 21.0.5-tem
# 验证
java -version
方式 B:apt 直接装(如果仓库里有 21)
sudo apt update
sudo apt install openjdk-21-jdk -y
java -version
javac -version
如果 apt 找不到 openjdk-21-jdk(22.04 早期镜像源可能没有),用 SDKMAN 或者加 Adoptium 仓库:
# 加 Eclipse Adoptium(Temurin)官方仓库
sudo apt install -y wget apt-transport-https gpg
wget -qO - https://packages.adoptium.net/artifactory/api/gpg/key/public | sudo gpg --dearmor -o /usr/share/keyrings/adoptium.gpg
echo "deb [signed-by=/usr/share/keyrings/adoptium.gpg] https://packages.adoptium.net/artifactory/deb $(awk -F= '/^VERSION_CODENAME/{print$2}' /etc/os-release) main" | sudo tee /etc/apt/sources.list.d/adoptium.list
sudo apt update
sudo apt install temurin-21-jdk -y
装完设置默认版本(如果机器上有多个 JDK):
sudo update-alternatives --config java
sudo update-alternatives --config javac
再配置一下环境变量(写进 ~/.bashrc 或 ~/.zshrc):
echo 'export JAVA_HOME=$(dirname $(dirname $(readlink -f $(which javac))))' >> ~/.bashrc
source ~/.bashrc
echo $JAVA_HOME
二、安装 Maven
sudo apt update
sudo apt install maven -y
mvn -version
mvn -version 输出里要确认 “Java version” 那行显示的是 21,如果不是,说明系统默认 JAVA_HOME 指向了旧版本,回到上一步用 update-alternatives --config java 切一下,或者在 ~/.bashrc 里手动 export JAVA_HOME=/path/to/jdk-21。
如果 apt 仓库里的 Maven 版本较老导致某些插件不兼容(少见),可以手动装最新版:
cd /opt
sudo wget https://dlcdn.apache.org/maven/maven-3/3.9.9/binaries/apache-maven-3.9.9-bin.tar.gz
sudo tar -xzf apache-maven-3.9.9-bin.tar.gz
sudo ln -s /opt/apache-maven-3.9.9 /opt/maven
echo 'export PATH=/opt/maven/bin:$PATH' >> ~/.bashrc
source ~/.bashrc
mvn -version
三、VS Code 安装 Java 支持
打开 VS Code,装这个扩展包(Extension Pack for Java,微软官方,会自动带上下面几个核心插件):
- 打开扩展面板(
Ctrl+Shift+X) - 搜索 “Extension Pack for Java”(发布者:Microsoft),点安装
它会自动装上:
- Language Support for Java™ by Red Hat —— 代码补全、跳转、重构
- Debugger for Java —— 断点调试
- Test Runner for Java —— 跑单元测试
- Maven for Java —— Maven 项目支持、依赖管理面板
- Project Manager for Java —— 项目结构管理
针对 Spring Boot 项目,再额外装:
- Spring Boot Extension Pack(发布者:VMware/Pivotal),包含:
- Spring Boot Tools(
application.yml智能提示、Bean 依赖图) - Spring Initializr Java Support(可以在 VS Code 里直接生成新项目)
- Spring Boot Dashboard(侧边栏一键启动/停止应用)
- Spring Boot Tools(
四、让 VS Code 认识 JDK 21
如果机器上装了多个 JDK 版本,VS Code 需要显式指定用哪个。Ctrl+Shift+P 打开命令面板,输入 “Java: Configure Java Runtime”,检查/设置项目使用的 JDK 路径。
也可以直接在项目根目录(或用户设置)的 settings.json 里配置:
{
"java.jdt.ls.java.home": "/home/你的用户名/.sdkman/candidates/java/21.0.5-tem",
"java.configuration.runtimes": [
{
"name": "JavaSE-21",
"path": "/home/你的用户名/.sdkman/candidates/java/21.0.5-tem",
"default": true
}
]
}
路径按你实际的 echo $JAVA_HOME 输出填。
五、打开并运行前面那个项目
- 解压
fastapi-java-client.zip,File > Open Folder打开这个目录 - VS Code 会自动识别
pom.xml,右下角弹出提示"是否加载 Maven 项目",点确认,等依赖下载完 - 打开
DemoApplication.java,类名上方会出现 Run | Debug 的小图标,直接点 Run 就能启动 Spring Boot(等价于mvn spring-boot:run) - 或者用命令行:
mvn clean package && java -jar target/fastapi-java-client.jar
六、验证清单
java -version # 应显示 21.x.x
mvn -version # Java version 那行也应为 21.x.x
装完这几步后,之前那个项目里的 record、sealed class 等 Java 21 新语法都能正常编译和高亮。如果中间某一步卡住(比如 apt 源找不到包、或者 VS Code 一直提示找不到 JDK),可按下面"常见问题"排查。
七、常见问题:多环境 PATH 冲突(conda / SDKMAN / apt 共存)
在装了 conda(Anaconda/Miniconda)的机器上,很容易出现 java -version 显示的版本和 SDKMAN 装的版本对不上的情况,本质是 PATH 优先级冲突——谁的路径排在前面,java 命令就会调用谁。
排查步骤
- 确认当前实际调用的是哪个
java:
which -a java
如果输出里根本没有出现 ~/.sdkman/candidates/java/... 这样的路径,说明当前终端会话没有加载 SDKMAN 的环境,而不是被 conda 覆盖。
- 确认使用的 shell:
echo $SHELL
SDKMAN 安装脚本默认只写入 ~/.bashrc,如果用的是 zsh,需要的是 ~/.zshrc。
- 检查初始化代码是否写入成功:
tail -5 ~/.bashrc
正常应能看到:
#THIS MUST BE AT THE END OF THE FILE FOR SDKMAN TO WORK!!!
export SDKMAN_DIR="$HOME/.sdkman"
[[ -s "${SDKMAN_DIR}/bin/sdkman-init.sh" ]] && source "${SDKMAN_DIR}/bin/sdkman-init.sh"
如果没有,手动补上:
cat >> ~/.bashrc << 'EOF'
#THIS MUST BE AT THE END OF THE FILE FOR SDKMAN TO WORK!!!
export SDKMAN_DIR="$HOME/.sdkman"
[[ -s "${SDKMAN_DIR}/bin/sdkman-init.sh" ]] && source "${SDKMAN_DIR}/bin/sdkman-init.sh"
EOF
source ~/.bashrc
用 zsh 的话把同样三行加到 ~/.zshrc 末尾并 source ~/.zshrc。
- 如果确实是 conda 环境里装了 JDK 导致覆盖(
conda list -n <环境名> | grep -i openjdk能看到),可以直接移除:
conda remove -n <环境名> openjdk -y
或者保证 SDKMAN 的初始化代码写在 conda 初始化代码块之后,让它的 PATH 优先级更高。
- 兜底验证(任何情况下都能立即生效,用于快速确认 SDKMAN 本身是否正常):
source "$HOME/.sdkman/bin/sdkman-init.sh"
which -a java
java --version
若此时 java --version 已正确显示 21.0.5,说明 SDKMAN 本身没问题,只是初始化脚本没有被自动加载,按第 3 步固化配置即可。
关于 VS Code
VS Code 的 Java 插件不读终端的 PATH,而是读 settings.json 里的 java.jdt.ls.java.home / java.configuration.runtimes 配置(见第四节),所以即便终端里的 java -version 暂时没修正,只要该配置直接指向 SDKMAN 安装的 21 版本路径,VS Code 内的编译运行不受影响。但终端里执行 mvn、java -jar 仍会受 PATH 影响,建议尽快按上面步骤把根源问题解决掉。
更多推荐


所有评论(0)