Skip to content

在VS Code中运行Java项目 ​

本文介绍如何在VS Code中运行Java程序和Spring Boot项目。

1. VS Code基本介绍 ​

VS Code(全称 Visual Studio Code)是由微软开发的一款免费、开源且跨平台的轻量级代码编辑器。

虽然它看起来像一个简单的文本编辑器,但由于其极其强大的扩展生态系统,它实际上已经成为了目前全球软件开发领域最受欢迎的开发工具之一。

下载地址:https://code.visualstudio.com/

1.1 设置介绍 ​

VS Code提供了多种选项,可以将编辑器的界面、功能等各方面,都按照自己的喜好来设置。

在VS Code中,设置选项有两个维度:

  • User settings(用户设置):相当于全局设置,无论你打开哪一个项目、哪一个文件夹,这些设置都会生效。存储在操作系统本地目录中,例如~/Library/Application Support/Code/User/settings.json(~表示用户目录)。
  • Workspace settings(工作区设置):针对当前项目的特殊设置,存储在项目根目录下的 .vscode/settings.json 文件中。

工作区设置的优先级高于用户设置,也就是说,如果同一个选项在两个地方都设置了,VS Code 会遵循 “就近原则”:

  1. 工作区设置 (Workspace) 具有最高优先级;
  2. 如果工作区没设,则看 用户设置 (User);
  3. 如果都没设,则使用 VS Code 默认值;

我们可以使用快捷键Cmd+,(或Ctrl + , ,Windows系统下)打开设置界面:

image-20260321094356588

也可以以json文件的形式打开设置,首先使用快捷键Cmd+p(Ctrl+p)打开命令面板:

  • 输入> Preferences: Open User Settings (JSON),以 json 格式打开用户设置;
  • 输入> Preferences: Open Workspace Settings (JSON),以 json 格式打开工作区设置;

1.2 常用设置 ​

本小节介绍一些常用的设置。

  • editor.fontSize:字体大小,建议根据屏幕分辨率调大至 14 或 16,默认值通常偏小;

  • Editor: Font Family:字体设置,推荐使用JetBrains Mono字体

    在macos中,可以使用以下命令安装:

    bash
    brew install --cask font-jetbrains-mono

    或者去官网下载手动安装:https://www.jetbrains.com/lp/mono/

    安装完成后,在在 Editor: Font Family 的最前面输入 'JetBrains Mono',即可使用该字体;

  • Editor: Word Wrap:控制换行的方式,它决定了当一行代码非常长,超出了编辑器窗口的右侧边缘时,VS Code 是让你横向滚动去读代码,还是自动把超出的部分折叠到下一行显示,选项:

    • off:不换行,横向滚动;
    • on:代码根据当前编辑器窗口的宽度自动换行;
    • wordWrapColumn:代码在指定的列数(默认 80 列)处换行,而不管窗口有多宽;
    • bounded:结合了 on 和 column。代码会在“窗口边缘”或“指定列数”中较小的那个位置换行;

    使用快捷键 Option + Z(Windows 是 Alt + Z),可以一键切换当前窗口的自动换行状态。

  • Editor: Word Wrap Column:控制编辑器的换行列,默认80;

  • Editor: Wrapping Indent:控制折行的缩进,选项有:

    • none:不缩进,折行从第1列开始;
    • same:折行的缩进量与父行相同;
    • indent:折行的缩进量比父行多1;
    • deepIndent:折行的缩进量比父行多2;
  • Files: Auto Save:是否自动保存文件,推荐设置为onFocusChange (窗口失去焦点时自动保存) 或 afterDelay (延迟 1 秒保存);

  • Auto Save Delay:自动保存延迟时间,以毫秒为单位;

  • Editor › Bracket Pair Colorization:是否启用括号对着色,用不同颜色区分嵌套的括号;

  • Editor › Bracket Pair Colorization: Independent Color Pool Per Bracket Type:是否每种类型的括号维护一套独立的颜色计数器,即() 有自己的颜色顺序,[] 有自己的颜色顺序,{} 也有自己的颜色顺序;

  • Editor › Minimap: Enabled:是否显示右侧缩略图;

  • Window: Auto Detect Color Scheme:如果已启动,将根据系统颜色模式自动选择颜色主题。如果系统颜色模式为深色,使用Workbench: Preferred Dark Color Theme(如果是高对比对,则使用Workbench: Preferred High Contrast Color Theme)配置中指定的颜色主题,如果系统颜色模式为浅色,使用Workbench: Preferred Light Color Theme(如果是高对比度,则使用Workbench: Preferred High Contrast Light Color Theme)配置中选择的颜色主题;

  • Workbench: Color Theme:未启用Window: Auto Detect Color Scheme时使用的颜色主题;

1.3 插件 ​

VS Code除了基础功能设置,还拥有着大量的插件,用于改善UI界面、增强功能。

在左侧活动栏可以打开插件视图:

image-20260321112426157

下面介绍一些基础插件:

  • Chinese (Simplified) (简体中文) Language Pack for Visual Studio Code:为VS Code提供中文显示语言。

    使用:按下“Ctrl+Shift+P”组合键以显示“命令面板”,然后键入“display”以筛选并显示“Configure Display Language”命令。按“Enter”,然后会按区域设置显示安装的语言列表,并突出显示当前语言设置。选择另一个“语言”以切换 UI 语言。

  • Material Icon Theme:为文件列表中的不同文件类型(如 .java, .xml, .json, .md)换上辨识度极高的图标。

  • Todo Tree:在左侧边栏汇总项目中所有的 // TODO 或 // FIXME 标签。

一些插件也带有配置项,我们同样可以在设置界面,找到扩展组,对插件进行设置:

image-20260321113637272

1.4 命令面板 ​

在 VS Code 中,快捷键**Cmd + P**(Windows 上是Ctrl + P )被称为 “快速打开”(Quick Open),这会打开一个命令面板:

image-20260321113901250

它的核心功能是快速搜索文件:只要输入文件名的一部分(甚至是几个字母),VS Code 就会列出项目里所有匹配的文件。

  • 模糊匹配: 不需要输入完整路径,比如想找 WarehouseService.java,只需输入 whs 或者 serv 就能搜到。
  • 最近打开: 默认情况下,按下快捷键后不输入任何内容,它会按时间倒序列出最近访问过的文件。

除了快速搜索文件,它还是一个“功能入口”。通过在输入框开头输入特定的特殊符号,它可以完成更多高级操作:

  • 跳转到指定行 —— 输入 :

    • 用法: 在命令面板输入 :120。

    • 作用: 瞬间跳转到当前文件的第 120 行。这对调试报错信息(异常堆栈通常带行号)极其有用。

  • 跳转到变量/方法/章节 —— 输入 @

    • 用法:在命令面板输入 @getUser。

    • 作用: 在当前文件内搜索属性、方法或类定义。配合 :(冒号) 还可以按类别分组(如 @:)。

  • 全局搜索变量/类 —— 输入 #

    • 用法: 在命令面板输入 #MyController。

    • 作用: 在整个项目中搜索符号(Symbol),而不仅仅是文件名。

  • 执行命令 —— 输入 >

    • 用法: 在命令面板输入 >reload。

    • 作用: 可以执行重启、安装插件等各种指令。

1.5 工作区 ​

工作区是指在VS Code中打开的一个或多个文件夹,在大多数情况下,工作区只是一个文件夹,但在一些情况下,工作区也可以包含多个文件夹,称为多根工作区(Multi-root workspaces)。

多根工作区并不要求其中的文件夹都在同一个父文件夹下,可以分散在文件系统不同位置。

一般情况下,在VS Code中打开单个文件夹就是打开了单根工作区,如果要打开多根工作区,需要打开名为<name>.code-workspace的JSON文件,例如:

json
{
  "folders": [
    {
      "path": "my-folder-a"
    },
    {
      "path": "my-folder-b"
    }
  ]
}

以上.code-workspace定义了工作区包含的文件夹。

在VS Code中打开多根工作区,显示会有所区别:

image-20260322104237463

  • 项目名称后会带有(工作区)提示;
  • 设置层级会多了一个文件夹,即工作区内不同的文件夹进行不同的设置;

在VS Code中,可通过文件菜单选项,创建多根工作区:

image-20260322104557450

此时会创建一个untitled.code-workspaces,如有需要可以保存工作区,以便后续打开。

2. Java基础程序 ​

本小节如何在VS Code中运行基础的java程序。

2.1 环境配置 ​

首先在插件商城搜索Extension Pack for Java,这是一个插件包,包含以下插件:

2.1.1 Language Support for Java(TM) by Red Hat ​

需要重点介绍一下 Language Support for Java(TM) by Red Hat,这是运行Java项目的基础,这个插件可以分为两个部分:

  • 插件前端:负责界面显示、接收快捷键操作、弹出补全窗口、显示错误波浪线,它比较“轻量”,主要负责和 VS Code 交互;
  • Language Server for Java:它通常是基于 Eclipse JDT.LS 开发的一个后台进程,它才是真正理解 Java 代码逻辑的。当输入代码时,它在后台扫描类路径、分析代码结构、计算符号引用,提供跳转到定义 (Go to Definition)、代码补全 (Auto-complete)、重构 (Refactoring)、语法检查 (Diagnostics) 等核心逻辑。

Language Server for Java也是一个Java进程,直接自带(内置嵌入)了一个轻量级的 JRE 21。

关于 Language Server for Java 的设置,有以下设置:

  • java.jdt.ls.java.home:指定用于启动 Language Server for Java 进程的JRE目录,如果没有指定,就使用内置的JRE,一般不建议修改;
  • java.jdt.ls.vmargs:指定在启动Language Server for Java时,添加的额外启动参数,例如-Xmx2G -Xms100m用来修改内存堆大小;
  • java.server.launchMode:插件启动模式,选项如下:
    • Standard:启动完整的语言服务。它会扫描整个项目,解析 Maven/Gradle 依赖,构建完整的代码索引。支持所有功能:代码补全、跳转定义、重构、错误检测、单元测试运行。
    • LightWeight:只启动一个最基础的解析器。它不会解析复杂的 Maven 依赖,也不会构建全局索引,仅支持基础的语法高亮、大纲视图(Outline)和简单的代码折叠。没有智能补全,没有类型检查。
    • Hybrid: 以 LightWeight 启动,能立刻看到代码;然后在后台默默启动 Standard 模式。当后台加载完成后,会自动从轻量模式切换到完整模式。建议设置为该值。
  • java.jdt.ls.lombokSupport.enabled:是否从项目类路径加载lombok处理器,保持开启状态;

在Java项目开发中,还有一些设置需要关心:

  • java.configuration.runtimes:配置JDK路径,例如:

    java
    "java.configuration.runtimes": [
        {
            "name": "JavaSE-25",
            "path": "/jdk-25.0.2.jdk/Contents/Home",
            "default": true
        },
        {
            "name": "JavaSE-17",
            "path": "/jdk-17.0.14.jdk/Contents/Home"
        },
        {
            "name": "JavaSE-21",
            "path": "/graalvm-jdk-21.0.5/Contents/Home"
        },
        {
            "name": "JavaSE-1.8",
            "path": "/jdk1.8.0_431.jdk/Contents/Home"
        }
    ]
    • name:JDK版本名称,必须符合JavaSE-xx的格式,在实际填写时,会有提示;
    • path:本地JDK路径;
    • default:是否为默认的JDK,当打开独立的 Java 文件时,将使用默认的运行时。所谓独立的Java文件,简单来说,就是随便新建一个文件夹,或者直接在桌面上写了一个 Hello.java,但这个文件夹里既没有 Maven 的 pom.xml,也没有 Gradle 的构建文件,甚至没有 Eclipse 的 .project 文件。
  • java.configuration.detectJdksAtStart:是否在启动时,自动检测本地安装的JDK,如果在java.configuration.runtimes中配置了同版本的JDK,以后者为准。

  • java.configuration.maven.userSettings:Maven的settings.xml文件位置,默认值为~/.m2/settings.xml,建议修改为实际路径。

    注意,该项设置属于**Language Support for Java™ (Red Hat)**插件,主要功能是用于代码补全、跳转、红波浪线检查。

    还有一个设置java.configuration.maven.globalSettings,这是对于电脑全部用户而言的maven配置文件路径,一般不需要设置。

  • java.autobuild.enabled:是否开启自动编译,决定 VS Code 是否在每次保存文件(或代码发生变化)时,立即在后台尝试编译 Java 代码。当这个选项开启(默认 true)时:

    • 即时报错: 只要写错了一个字母或者少了一个分号,VS Code 不需要手动执行 mvn compile,就会立即在代码下方划红线;
    • 增量编译: 插件会在后台维护一个编译后的 .class 文件映射。这意味着只会重新编译新增加的或修改后的Java文件;
    • 依赖同步: 在 Maven 项目中,如果修改了 pom.xml,它会触发自动构建来确保类路径是最新的;

2.2 Hello World ​

配置了Language Support for Java(TM) by Red Hat,我们就可以在VS Code中编写Java程序了。

新建文件夹vscode-basic-java,在该文件夹中创建文件Hello.java:

java
public class Hello {
    public static void main(String[] args) {
        System.out.println("Hello, World!");
    }
}

打开命令面板,输入> Java: Configure Java Runtime,配置JDK:

image-20260322143543179

image-20260322143634473

然后,回到Hello.java界面,点击Run,即可运行Java文件:

image-20260322143726077

通过Project Settings界面的方式设置JDK版本有点麻烦,我们也可以在工作区配置文件中设置:

json
{
	"java.configuration.runtimes": [
        {
            "name": "JavaSE-1.8",
            "path": "/jdk1.8.0_431.jdk/Contents/Home",
            "default": true
        }
    ]
}

有的时候,更改了设置后,我们需要清理Language Server的缓存,在命令行中输入以下命令清理:

txt
Java: Clean Java Language Server Workspace

2.3 Maven for Java ​

Maven for Java插件为VS Code提供了maven支持,包括从 Maven Archetype创建maven项目,执行maven命令,产生effective POM,管理依赖等。

2.3.1 插件设置 ​

  • maven.settingsFile:指定maven的settings.xml配置文件路径。执行 mvn clean/install等命令、查看依赖树等时,会使用配置的设置文件,才不会报错;

  • maven.showInExplorerContextMenu:开启此项后,在VS Code的文件夹浏览器中,右键文件夹打开菜单,会增加一个命令,用来新建Maven项目:

    image-20260322153255040

  • maven.executable.preferMavenWrapper:指定是否优先使用Maven Wrapper,如果为true,则尝试向上遍历父文件夹寻找mvnw作为可执行文件,如果为false,或者找不到mvnw,则尝试使用系统PATH中的mvn;

    TIP

    什么是Maven Wrapper

    Maven Wrapper 是一个项目内置的 Maven 管理器。它允许在不预先安装 Maven 的情况下运行 Maven 命令,并确保项目中的所有开发者(以及 CI/CD 服务器)都使用完全相同版本的 Maven。

    在传统的开发模式中,需要手动下载 Maven 并配置 PATH。

    • 痛点 A: 同事小王用的是 Maven 3.6,我用的是 3.9,结果他在打包 WMS 项目时成功了,我却因为某个插件版本不兼容报错了。
    • 痛点 B: 每次换新电脑或配置 Jenkins 自动部署时,都要手动装一遍 Maven,非常繁琐。

    Maven Wrapper 的出现就是为了实现: “项目自带 Maven,拉下代码即运行,版本全员统一。”

    当看到一个项目根目录下有以下文件时,说明它启用了 Maven Wrapper:

    • mvnw (Unix/macOS 脚本):在终端执行的替代命令。
    • mvnw.cmd (Windows 脚本):Windows 环境下的替代命令。
    • .mvn/wrapper/:存放核心逻辑的文件夹。
      • maven-wrapper.jar:负责下载和启动 Maven 的 Java 小程序。
      • maven-wrapper.properties:最重要的配置文件,里面记录了该项目指定使用的 Maven 版本下载地址。

    如果使用了Maven Wrapper,不再需要使用系统的 mvn 命令,而是改用项目自带的脚本:

    • 在 macOS/Linux 上: ./mvnw clean install
    • 在 Windows 上: mvnw.cmd clean install

    第一次运行命令时,它会自动检测电脑上是否有该版本的 Maven。如果没有,它会静默下载到用户目录下(通常是 ~/.m2/wrapper/dists,当然也可以修改),然后执行命令。之后再运行就会直接调用缓存,速度极快。

    当启用了maven.executable.preferMavenWrapper后,当点击侧边栏的生命周期按钮时,VS Code 会优先调用项目里的 ./mvnw 而不是系统里的 mvn。

  • maven.executable.path:指定mvn可执行文件的绝对路径。当此值为空时,它会根据maven.executable.preferMavenWrapper的值,尝试使用mvn或mvnw;

  • maven.completion.gavEnabled:自动补全GroupId、ArtifactId和Version;

2.3.2 功能介绍 ​

下面介绍Maven for Java提供的功能。

新建Maven项目:在文件夹右键打开菜单,选择Maven->从Maven原型创建新项目

image-20260322153255040

image-20260322161706168

便可以交互式地创建Maven新项目。

管理maven项目:创建完成后,在左侧面板会出现MAVEN面板,可以通过该面板执行生命周期目标、查看项目依赖等。

image-20260322162041678

添加依赖:打开命令面板,输入Maven: Add a Dependency,将会打开一个面板,用于输入关键字来搜索依赖:

image-20260322165124210

这种方式实际就是请求以下路径用来搜索依赖项:

https://search.maven.org/solrsearch/select?q=spring

如果发现搜索速度很慢,需要排查代理设置,在用户设置中配置代理:

json
{
    "http.proxy": "http://127.0.0.1:9000",
    "http.proxySupport": "on",
    "http.proxyStrictSSL": false
}

3. 调试Java程序 ​

3.1 调试介绍 ​

在VS Code中,可以调试不同类型的程序,VS Code内置支持对JavaScript, TypeScript 以及 Node.js 程序的调试,如果是其他语言,可以通过安装插件的方式支持调试,例如Debugger for Java。

我们可以通过左侧活动栏的运行和调试界面,启动调试(或者在Java程序的上方点击Debug),进入调试,界面如下:

image-20260322191722257

  1. 监控面板:在调试监控面板中,分为变量、监视、调用堆栈、断点四个子界面;

  2. 控制栏:可以控制调试进程,逐过程调试、单步调试、停止调试等;

  3. 断点:在程序左侧行号位置处,打上断点(出现红点🔴即意味着成功打上了断点),程序运行到断点处会停止;

  4. 输出终端:程序运行过程中,输出到控制台的内容会显示在这里;

  5. 调试控制台:可以通过调试控制台快速查看值;

    image-20260322192534137

以上启动调试时,VS Code实际上是在内存中,自动生成了启动配置(Launch Configuration),如果是复杂项目的调试,需要我们手动控制,这就需要我们自己创建 launch.json 文件,位置放在.vscode目录下,我们也可以通过运行和调试界面,快速创建launch.json文件:

image-20260322193552854

创建后,VS Code会提示让我们选择配置:

image-20260322193630446

创建完成后,在运行和调试界面,就可以选择我们新加的调试配置进行调试了:

image-20260322193809914

3.2 通用调试配置 ​

在调试配置中,有一些选项是通用的,比如:

  • type:要调试的程序类型,例如java、python、node等;

  • name:调试配置名称,会显示在运行和调试界面;

  • request:调试模式,可选值为launch和attach;

TIP

关于launch和attach两种调试模式,有什么区别?

attach模式,即要调试的程序已经在运行中了,VS Code 只是通过 网络协议 连接到正在运行的程序上,观察它的状态。在attach模式下,要调试的程序不是由VS Code启动的。

launch模式,即由VS Code启动要调试的程序,然后再连接到运行程序上。可以理解为,launch模式的最后一步,就是attach模式。

Java 虚拟机(JVM)内置了一个非常强大的协议:JDWP (Java Debug Wire Protocol),可以连接到正在运行的Java程序上,要实现 Attach 调试,需要两步走:

第一步:被调试的程序必须“开门”

Java 程序在启动时,必须带上一段特殊的 JVM 参数,告诉它:“我允许别人来调试我,请监听某个端口。”

Java 8 及以上版本的命令示例:

bash
java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 -jar demo-app.jar
  • transport=dt_socket:使用套接字传输。
  • server=y:作为服务器等待连接。
  • suspend=n:非常重要。n 表示程序启动后直接运行,不等待调试器;如果想调试启动过程(如 Bean 初始化),设为 y。
  • address=5005:在 5005 端口监听调试连接。

第二步:VS Code 配置 launch.json 挂载

在 VS Code 中,需要告诉它去连哪个地址和端口:

json
{
    "type": "java",
    "request": "attach",
    "name": "Attach到远程调试",
    "hostName": "192.168.1.100", // 如果是本地就填 "localhost"
    "port": 5005,
    "projectName": "demo-app" // 必须指定项目名,否则无法映射源码
}

这样就可以使用attach模式,连接到运行中的Java程序进行调试了。

使用 Attach 模式的注意事项:

  • 源码必须一致:本地 VS Code 里的代码必须和远程服务器上跑的 .jar 包源码版本完全一致,否则断点会“漂移”或者对不上行号。
  • 防火墙策略:如果 Attach 远程服务器,确保服务器的 5005 端口是开放的。
  • 网络延迟:如果服务器在海外,调试起来会有明显的卡顿感,因为每走一步都要通过网络同步内存状态。

关于launch模式和attach模式的流程如下:

Launch (一站式启动)

  1. 准备环境:VS Code 读取 launch.json 里的 vmArgs、env。
  2. 创建进程:VS Code 亲自调用 java -agentlib:jdwp=... 命令。
  3. 自动连接:程序启动的同时,VS Code 内部的调试器立即自动 Attach 到那个 JDWP 端口上。
  4. 结果:点击停止,VS Code 会杀掉(Kill)这个进程。

Attach (中途介入)

  1. 程序自理:自己(或者脚本、Docker)先运行 Java 程序,并手动带上调试参数(-agentlib:jdwp=...),此时程序已经在跑了。
  2. 手动连接:点击 VS Code 的调试按钮,VS Code 尝试去连接指定的 IP 和端口。
  3. 结果:点击停止,VS Code 只是断开连接,Java 程序依然在运行 。

3.3 Java调试配置 ​

下面介绍在Java调试时,需要注意的相关配置参数。

如果request: launch时,以下配置参数可用:

  • mainClass:程序入口,主类的全名或主类对应的Java文件路径,必需,例如com.example.App;

  • projectName:项目名称,如果在多个项目中,主类名称相同,那么可以使用项目名称来区分,如果在工作区中有多个Java项目,该项配置必需填写;

  • vmArgs:额外的虚拟机参数,例如-Xms<size> -Xmx<size> -D<name>=<value>;

  • env:额外的环境变量,例如:

    json
    "env": {
        "DB_PASSWORD": "root_password_123",
        "LOG_LEVEL": "DEBUG",
        "WMS_SERVER_ID": "BJ-001"
    }

    如果额外的环境变量很多,可以使用envFile配置;

  • args:args 属性用于传递 “程序参数”。它对应的是 Java 入口方法 public static void main(String[] args) 中的那个 String[] 数组。例如:

    json
    "args": [
        "--port=8081",
        "--mode=debug",
        "import-data"
    ]
    txt
    // args[0] 会是 "--port=8081"
    // args[1] 会是 "--mode=debug"
    // args[2] 会是 "import-data"
  • encoding:JVM的file.encoding设置,默认值为UTF-8;

  • cwd:程序工作目录,默认值为${workspaceFolder};

  • stopOnEntry:在程序启动后,是否自动暂停;

  • console:console 参数决定了调试启动后,程序的**标准输入(Scanner)和标准输出(System.out.println)**通过哪个窗口进行交互。选项如下:

    • internalConsole:调试控制台,输出内容会直接显示在 VS Code 底部的调试控制台标签页中。

      缺点是不支持标准输入,即如果程序需要我们在控制台中输入内容,不能使用这种方式;

    • integratedTerminal:集成终端,默认值;程序会在 VS Code 窗口下方的终端标签页中运行。

      • 优点:全功能支持。它就是一个真实的终端(macOS 上的 zsh 或 Windows 上的 PowerShell)。可以正常使用 Scanner 输入数据,颜色显示(如 Logback 的彩色日志)也最完美;
      • 缺点:输出内容多了之后,滚动和搜索不如调试控制台方便;
      • 适用场景:日常开发首选;
    • externalTerminal:外部终端,运行调试时,电脑会自动弹出一个独立的终端窗口;

  • shortenCommandLine:操作系统对命令行字符串的长度是有上限的,Java 启动时需要把所有 Jar 包的路径拼在一起传给 java -cp 命令。如果 pom.xml 里有上百个依赖,这个字符串会轻而易举地突破系统上限。可以使用该配置缩短命令行长度,可选值如下:

    • none:不做任何处理;
    • jarmanifest:VS Code 会在临时文件夹里创建一个极其小的 classpath.jar,这个 Jar 包里几乎没代码,只有一个 META-INF/MANIFEST.MF 文件,里面写着 Class-Path: lib1.jar lib2.jar ...。启动程序时,执行命令java -cp classpath.jar com.example.App,这样命令长度永远只有几十个字符;
    • argfile:将所有的环境变量、类路径、虚拟机参数全部塞进一个文本文件(如 args.txt),启动程序时,使用命令java @args.txt。注意,该项配置只能在Java 9及之后使用;
    • auto:VS Code 会在启动前先“算一下”这行命令有多长,如果长度没超标,就用 none,如果超标了,它会根据JDK 版本自动选择 jarmanifest(JDK 8)或 argfile(JDK 9+);
  • stepFilters:在单步调试(Step Into)时自动跳过指定的类或方法,避免进入无关的底层源码。配置如下:

    • skipClasses:指定需要跳过调试的类名列表。

      用法:支持完整类名或通配符。

      • $JDK:跳过所有 JDK 核心类库(如 java., javax.)。
      • $Libraries:跳过所有第三方 Maven/Gradle 依赖库。
      • java.*:跳过 java 包下的所有类。
      • *.Foo:跳过所有以 Foo 结尾的类
    • skipSynthetics:跳过合成方法(Synthetic Methods)。

      合成方法是由 Java 编译器自动生成的(例如内部类访问私有变量时生成的 access$ 方法),跳过它们可以使调试轨迹更符合原始代码逻辑。

    • skipStaticInitializers:跳过静态初始化块(static { ... })。

      当类第一次被加载时会执行静态代码块,开启此项后,单步执行到该类时不会停留在这些初始化逻辑中。

    • skipConstructors:跳过构造方法。

      在创建对象(new Object())时,调试器将直接完成实例化,而不会进入构造函数内部,除非在构造函数中手动打了断点。

    例如:

    json
    "stepFilters": {
        "skipClasses": [
            "$JDK",
            "$Libraries",
            "com.sun.*",
            "org.springframework.*",
            "org.apache.ibatis.*",
            "com.baomidou.mybatisplus.*"
        ],
        "skipSynthetics": true,
        "skipStaticInitializers": true,
        "skipConstructors": false
    }

如果request: attach时,以下配置参数可用:

  • hostName:必填,远程 Java 进程所在的主机名或 IP 地址。如果是调试本地运行的程序,填 localhost 或 127.0.0.1;

  • port:必填,远程 Java 进程开启的 JDWP 调试端口(例如之前提到的 5005)。注意这不是 Spring Boot 的 Web 端口(8080);

  • processId:用于本地调试,通过进程 ID (PID) 进行关联。

    ${command:PickJavaProcess}:启动调试时,VS Code 会弹出一个列表用来选择当前电脑上运行的 Java 进程,不用手动查 PID。

    整数 PID:直接填入数字(如 1234),强制连接该进程。

  • timeout:连接超时时间(毫秒),默认 30000ms(30秒)。如果网络环境较差(如连接跨境服务器),建议调大此值;

  • projectName:指定首选项目名称。在多模块项目(Multi-module)中至关重要。如果存在同名类,调试器会优先去这个项目里找源码,确保条件断点和变量查看能正确工作;

4. Spring Boot程序 ​

有了以上的插件和设置,其实就可以在VS Code 中开发与运行Spring Boot程序了。但是,为了让开发Spring Boot项目的过程更加轻松,需要安装其他插件。

在VS Code中,对Spring Boot开发的支持也是通过插件来实现的,推荐安装Spring Boot Extension Pack插件,这也是一个插件包,包含以下三个插件:

  • Spring Boot Tools:在开发过程中,提供代码补全、配置文件校验等;
  • Spring Initializr:提供创建Spring Boot项目、管理依赖功能;
  • Spring Boot Dashboard:在左侧面板中提供启停Spring Boot项目、管理Bean、查看端点(API)功能;

4.1 Spring Initializr ​

Spring Initializr提供了创建Spring Boot程序的快捷方式。

安装完插件后,打开命令面板,输入以下命令,即可开始创建Spring Boot项目:

txt
> Spring Initializr

image-20260323212005574

选择具体的创建方式后,根据提示,依次:

  1. 选择Spring Boot版本;
  2. 选择Java版本;
  3. 输入group id、artifact id;
  4. 选择依赖;

之后,Spring Initializr就为我们创建好了Spring Boot项目,打开界面如下:

image-20260323212633279

我们也可以通过配置插件,控制创建Spring Boot项目过程中的一些默认值,比如默认语言(Java)、默认Java版本等等:

image-20260323213123885

Spring Initializr除了可以帮助我们创建项目,还可以管理依赖,在pom.xml文件中,依赖标签旁边,按住Ctrl点击Add Spring Boot Starters...,就会弹出搜索框,选择依赖:

image-20260323212751477

4.2 Spring Boot Tools ​

Spring Boot Tools用于开发过程中的智能补全、配置校验、代码检测等功能。

该插件会在后台启动spring-boot-language-server JVM进程,这个进程是插件大脑,负责解析 Java 代码、分析 Spring 注解、扫描 application.yml、计算 Bean 依赖关系等。

在插件设置中,可以设置spring-boot-language-server JVM进程相关配置,比如配置堆内存大小、JDK路径、额外的启动参数等:

image-20260323232948273

在代码开发过程中,可以通过设置插件,进行配置文件校验、SpEL表达式校验、SQL语法校验、CRON表达式校验等,在插件设置界面可以查看。

在代码开发过程中,也可以使用Spring Boot Tools提供的功能。

比如在命令面板中输入#@查看BEAN和API:

image-20260323233425580

代码片段:

image-20260323233536575

配置项悬浮说明:

image-20260323233650119

4.3 Spring Boot Dashboard ​

Spring Boot Dashboard提供了左侧菜单用于管理Spring Boot项目,主要有三大板块:

  • APPS:可以在该板块启动项目,打开浏览器界面;
  • BEANS:查看项目的BEAN,并可以跳转到BEAN定义处;
  • ENDPOINT MAPPINGS:查看项目API端点,点击可跳转到API定义处;

image-20260323231103041

在Spring Boot Dashboard插件设置中,主要关注以下配置:

  • spring.dashboard.openUrl:当启动Spring Boot项目后,点击APPS界面左侧的浏览器图标时,打开的浏览器地址,默认为{protocol}://{hostname}:{port}{contextPath},可以设置为Swagger地址,方便调试;

    image-20260323231550243

  • spring.dashboard.openWith:在哪里打开浏览器,默认为在VS Code内置浏览器中打开,也可以改为系统默认浏览器;

5. 其他插件 ​

5.1 Rest Client ​

Rest Client允许在VS Code中执行HTTP请求并查看响应。类似插件还有Thunder Client。

5.1.1 基础使用 ​

安装完插件后,创建一个后缀名为.http或.rest的文件,就可以在该文件中编写HTTP请求了,例如:

http
GET https://example.com/comments/1 HTTP/1.1

###

GET https://example.com/topics/1 HTTP/1.1

###

POST https://example.com/comments HTTP/1.1
content-type: application/json

{
    "name": "sample",
    "time": "Wed, 21 Oct 2015 18:27:50 GMT"
}

以上定义了三个HTTP请求,以###分隔每个请求。在VS Code中,每个请求上方会有Send Request提示,点击即可发送请求,显示如下:

image-20260324195108038

完整请求格式如下:

txt
请求方式 请求地址 HTTP版本
请求头(以key: value)的形式,每个请求头占据一行

请求体

请求头和请求体中间需要有一空白行。

也可以上传文件,例如:

txt
POST https://example.com/comments HTTP/1.1
Content-Type: application/json
Authorization: token xxx

< C:\Users\Default\Desktop\demo.json

###

POST https://example.com/comments HTTP/1.1
Content-Type: application/json
Authorization: token xxx

< ./demo.json

支持从相对路径(相对.http文件)和绝对路径读取文件内容并上传,默认以UTF-8编码格式读取。

当然也可以表格数据的形式请求接口:

txt
POST https://api.example.com/user/upload
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW

------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="text"

title
------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="image"; filename="1.png"
Content-Type: image/png

< ./1.png
------WebKitFormBoundary7MA4YWxkTrZu0gW--

5.1.2 变量 ​

REST Client种支持设置变量,其中包括两种类型的变量:

  • 自定义变量:根据定义位置和定义方式不同,可以细分为环境变量、文件变量、提示变量和请求变量;

    优先级从高到低:提示变量>请求变量>文件变量>环境变量

  • 系统变量:是预定义的变量,可以直接使用;

使用两种类型变量的方式也不同:使用自定义变量,通过{{variableName}}的格式;使用系统变量,通过{{$variableName}}格式。

环境变量

环境变量定义在Rest Client设置中,如下:

json
{
  "rest-client.environmentVariables": {
    "$shared": {
        "version": "v1",
        "prodToken": "foo",
        "nonProdToken": "bar"
    },
    "local": {
        "version": "v2",
        "host": "localhost",
        "token": "{{$shared nonProdToken}}",
        "secretKey": "devSecret"
    },
    "production": {
        "host": "example.com",
        "token": "{{$shared prodToken}}",
        "secretKey" : "prodSecret"
    }
	}
}
  • $shared是共享的环境变量,对于任何环境下都成立;
  • local和production是具体的环境名,在其中定义的属性会覆盖掉$shared中的同名属性,如果没有定义,则会使用$shared中的属性;

当定义好后,可以在.http请求文件中使用:

http
GET https://{{host}}/api/{{version}}comments/1 HTTP/1.1
Authorization: {{token}}

之后,打开命令面板,输入> Rest Client: Switch Environment(也可以在右下角选择),即可选择使用哪个环境:

image-20260324205705161

文件变量

文件变量只能用在当前接口文件。

必须以 @ 开头,紧跟变量名,中间用 = 连接,一个变量占据一行。变量名不能包含空格,值可以包含空格(前后空格会被自动修剪),支持转义字符(如 \n 表示换行)。

文件变量也可以引用其他变量。

例如:

txt
@hostname = localhost
@port = 8080
# baseUrl 引用了 hostname和port变量
@baseUrl = http://{{hostname}}:{{port}} 
@contentType = application/json
@adminEmail = admin@example.com

文件变量可以放在两个位置:文件顶部和请求前

放在文件顶部(独立区块):这是最清晰的写法,通常放在文件最开始,用 ### 与接口分隔。

txt
@hostname = localhost
@port = 8080

###

GET http://{{hostname}}:{{port}}/api/users

放在请求行之前:变量定义和请求 URL 之间必须有一个空行。

txt
@token = my-secret-token

GET http://localhost:8080/api/profile
Authorization: {{token}}

无论放在哪,全文件都可以引用。

提示变量

“提示变量”就是交互式参数,当点击发送请求时,弹出一个输入框,需要临时填入值。

提示变量必须定义在请求行(URL)之前的注释行中,使用 @prompt 关键字。

  • 基础格式:# @prompt 变量名
  • 带描述的格式:# @prompt 变量名 {这里写提示文字}(推荐,用户体验更好)

例如:

txt
# @prompt userId 请输入用户ID
# @prompt remark 请输入修改备注

POST http://localhost:8080/api/user/update
Content-Type: application/json

{
    "id": "{{userId}}",
    "note": "{{remark}}"
}

image-20260324211533022

请求变量

请求变量是一种特殊的文件变量,它是从其他请求(或该请求的响应)中获取值,用在该请求中,它和文件变量的不同是:文件变量是静态定义的,而请求变量是动态捕获的。

要使用请求变量,需要先给请求命名,在请求行的上方,使用 # @name 注释给该请求指定一个唯一的标识符。

txt
# @name login
POST https://api.example.com/login
Content-Type: application/json

{
    "username": "admin",
    "password": "123"
}

然后在后续请求中,就可以使用 {{请求名称.属性.路径}}的语法进行调用:

txt
### 获取用户信息

GET https://api.example.com/profile
Authorization: Bearer {{login.response.body.token}}

请求变量的引用遵循层级结构,格式为:

{{requestName.(response|request).(body|headers).(*|JSONPath|XPath|Header Name)}}.

必须先手动点击运行“被命名”的请求(如上面的 login),插件才会把结果存入内存。直接运行第二个请求,不会自动调用所依赖的请求,而是直接使用子面量{{login.response.body.token}},因此通常会失败。

系统变量

系统变量是由Rest Client预先定义的,可直接使用的变量,通过{{$variableName}}格式使用,下面是具体的系统变量:

  • {{$randomInt min max}}:返回在min(包含)和max(不包含)范围内的随机整数;

  • {{$guid}}:返回一个随机的UUID;

  • {{$dotenv variableName}}:从当前 .http 文件同级目录下的 .env 文件中读取名为variableName的值;

  • {{$timestamp [offset option]}}:生成 Unix 时间戳。

    • {{$timestamp}} → 1742826627(当前时间);

    • {{$timestamp -3 h}} → 3 小时前的时间戳;

    • {{$timestamp 1 d}} → 明天此时的时间戳;

  • {{$datetime rfc1123|iso8601|"custom format"|'custom format' [offset option]}}与 {{$localDatetime ...}}:生成格式化日期字符串。

    • $datetime 使用 UTC 时间,$localDatetime 使用电脑的本地时区;
    • 常用格式:iso8601(2026-03-24T...)或 rfc1123(Tue, 24 Mar 2026...);
    • 自定义格式:可以使用 Day.js 语法,如 {{$localDatetime "YYYY-MM-DD HH:mm:ss"}};
    • offset option:可以进行时间偏移;

5.1.3 设置 ​

Rest Client有一些设置:

  • rest-client.defaultHeaders:默认请求头;

  • rest-client.timeoutinmilliseconds:请求超时时间(以毫秒为单位),默认为0表示不超时;

  • rest-client.excludeHostsForProxy:不使用代理的地址设置,建议加入localhost和127.0.0.1;

  • rest-client.environmentVariables:环境变量配置;

  • rest-client.previewOption:如何显示响应,默认为full,表示完整展示,可选值:

    OptionDescription
    fullDefault. Full response is previewed
    headersOnly the response headers(including status line) are previewed
    bodyOnly the response body is previewed
    exchangePreview the whole HTTP exchange(request and response)

5.2 Todo Tree ​

Todo Tree可以将项目中的待办事项集中显示在面板中。例如:

image-20260324215058155

5.3 Git 相关 ​

5.3.1 Git Blame ​

Git Blame可以在某一行后面或者右下角显示当前行的提交信息、提交人、提交时间。

image-20260325095624152

设置如下:

  • "gitblame.inlineMessageEnabled": true:打开行内提交信息展示;
  • "gitblame.inlineMessageFormat": "${commit.summary} (by ${author.name} ${time.ago})":行内提交信息展示格式;
  • "gitblame.extendedHoverInformation": "inline":当鼠标悬浮在提交信息上时,展示详细信息
    • inline:只有在行内提交信息悬浮时才展示;
    • status:只有在右下角状态栏提交信息悬浮时才展示;
    • inline-status:在行内提交信息和右下角状态栏提交信息悬浮式都展示;
    • off:不展示;

5.3.2 Git Graph ​

GIt Graph可以在编辑器中以图表形式展示Git提交记录,并且可以执行Git 操作:

image-20260325100455915

在某个提交右键打开操作面板:

image-20260325100623166

5.3.3 查看某文件提交记录 ​

在VS Code中,内置了查看某文件提交记录的功能,即左下角的时间线面板:

image-20260325100811325

5.4 MyBatis Boost ​

MyBatis Boost提供MyBatis一站式支持,包括Mapper跳转、Mapper生成、SQL拦截及日志记录、SQL格式化、SQL关键词高亮等。

Mapper跳转:

image-20260325100923198

Mapper生成:

image-20260325101009201

5.5 Material Icon Theme ​

Material Icon Theme的核心作用是将编辑器左侧文件树中原本单调、通用的图标,替换为一套基于 Google Material Design 规范的、高度可识别的彩色图标。

  1. 安装完成后,会弹框选择主题,之后即可生效;
  2. 如果没有生效,在命令面板中输入> Material Icons: Activate Icon Theme激活;

效果如下:

image-20260324224314795

6. 其他问题 ​

6.1 中文乱码 ​

运行项目后,发现控制台出现中文乱码,添加以下设置(建议添加到用户设置)解决:

json
{
    "terminal.integrated.profiles.windows": {
        "PowerShell": {
            "path": "powershell.exe",
            "args": [
                "-NoExit",
                "-Command",
                "chcp 65001"
            ]
        }
    },
    "terminal.integrated.defaultProfile.windows": "PowerShell",
}

这两行配置的核心作用是:将 PowerShell 设为 VS Code 的默认终端,并在每次启动时自动执行“切换到 UTF-8 编码”的命令。

args (参数列表): 这是解决乱码的关键。

  • chcp 65001: 重点。chcp 是 "Change Code Page" 的缩写,65001 是 UTF-8 的代码页编号。执行这个命令后,当前终端窗口就能正确处理和显示 UTF-8 编码的字符
  • -Command: 告诉 PowerShell 启动后立即运行后面的命令(即 chcp 65001)
  • -NoExit: 告诉 PowerShell 在运行完命令后不要关闭窗口,而是保持开启状态

配置后终端顶部多出了一行 Active code page: 65001 的提示

6.2 源码查看 ​

当查看依赖源码时,会发现只能显示反编译后的代码,没法查看源码,可通过以下方法解决:

  • 开启自动下载源码设置:

    txt
    "java.maven.downloadSources": true
  • 如果依赖是自己编译的,在依赖的pom.xml加上源码导出:

    xml
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-source-plugin</artifactId>
                <version>3.2.1</version>
                <executions>
                    <execution>
                        <id>attach-sources</id>
                        <goals>
                            <goal>jar-no-fork</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>