在 Ubuntu 22.04 + VS Code 上把 Spring Boot 项目跑起来,需要装:JDK 21MavenVS 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,微软官方,会自动带上下面几个核心插件):

  1. 打开扩展面板(Ctrl+Shift+X
  2. 搜索 “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(侧边栏一键启动/停止应用)

四、让 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 输出填。

五、打开并运行前面那个项目

  1. 解压 fastapi-java-client.zipFile > Open Folder 打开这个目录
  2. VS Code 会自动识别 pom.xml,右下角弹出提示"是否加载 Maven 项目",点确认,等依赖下载完
  3. 打开 DemoApplication.java,类名上方会出现 Run | Debug 的小图标,直接点 Run 就能启动 Spring Boot(等价于 mvn spring-boot:run
  4. 或者用命令行:mvn clean package && java -jar target/fastapi-java-client.jar

六、验证清单

java -version      # 应显示 21.x.x
mvn -version       # Java version 那行也应为 21.x.x

装完这几步后,之前那个项目里的 recordsealed class 等 Java 21 新语法都能正常编译和高亮。如果中间某一步卡住(比如 apt 源找不到包、或者 VS Code 一直提示找不到 JDK),可按下面"常见问题"排查。

七、常见问题:多环境 PATH 冲突(conda / SDKMAN / apt 共存)

在装了 conda(Anaconda/Miniconda)的机器上,很容易出现 java -version 显示的版本和 SDKMAN 装的版本对不上的情况,本质是 PATH 优先级冲突——谁的路径排在前面,java 命令就会调用谁。

排查步骤

  1. 确认当前实际调用的是哪个 java
which -a java

如果输出里根本没有出现 ~/.sdkman/candidates/java/... 这样的路径,说明当前终端会话没有加载 SDKMAN 的环境,而不是被 conda 覆盖。

  1. 确认使用的 shell:
echo $SHELL

SDKMAN 安装脚本默认只写入 ~/.bashrc,如果用的是 zsh,需要的是 ~/.zshrc

  1. 检查初始化代码是否写入成功:
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

  1. 如果确实是 conda 环境里装了 JDK 导致覆盖(conda list -n <环境名> | grep -i openjdk 能看到),可以直接移除:
conda remove -n <环境名> openjdk -y

或者保证 SDKMAN 的初始化代码写在 conda 初始化代码块之后,让它的 PATH 优先级更高。

  1. 兜底验证(任何情况下都能立即生效,用于快速确认 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 内的编译运行不受影响。但终端里执行 mvnjava -jar 仍会受 PATH 影响,建议尽快按上面步骤把根源问题解决掉。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐