1. 先搞清楚 VS Code 里的 Java 项目支持到底是怎么工作的
很多人一提到 VS Code 写 Java,第一反应就是“装个扩展就能写”。但真正把 Maven 或 Gradle 项目导进来之后,才发现事情没那么简单:代码飘红、依赖找不到、构建任务跑不起来、多模块工程导入后结构乱成一团。这些问题的根源,往往不是 VS Code 本身,而是你没弄明白 VS Code 的 Java 项目支持机制——尤其是 Maven 和 Gradle 各自是怎么被“读懂”的。
先说一个最容易忽略的事实:VS Code 不是一个 Java IDE,它是一个编辑器外加一套可组合的工具链。Maven 支持和 Gradle 支持并不是内置能力,而是通过扩展加载进来的。Java 语言服务负责代码分析、类型解析和编辑辅助;Maven/Gradle 扩展负责读取构建配置、生成项目模型、执行任务和追踪依赖变化。这两条线配合得好,你才有“这玩意儿居然像个 IDE”的体验;配合不好,就是各种飘红和卡顿。
我用一个比较土的类比来解释整条链路。编译器好比是翻译官,把 Java 源码翻译成字节码;构建工具(Maven 或 Gradle)是包工头,负责把砖块、水泥、钢筋(依赖库)按图纸(构建配置)搬到工地;语言服务是监工,它要在你看代码的时候随时告诉你“这面墙砌得对不对”。问题在于,监工不是自己去数砖块的,它得从包工头的账本里拿数据。Maven 和 Gradle 的账本记录方式不一样——一个是静态表格,一个是动态流水账——这就决定了导入机制、刷新频率、出错表现都会有明显差异。后面的内容会持续围绕这个底层差异展开。
如果你是刚接触 VS Code Java 开发,或者从其他 IDE 迁移过来,这篇文章会帮你理清 Maven 和 Gradle 在这套工具链里分别扮演什么角色、有哪些常见坑、遇到问题该从哪条链路下手排查。如果你是个老手,也可以跳过前半部分,直接看多模块工程的配置细节和排错链路,我尽量把平时文档里查不到的操作经验都写出来。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 环境准备阶段最容易踩的三个坑:JDK 匹配、扩展组合、工作区信任
2.1 JDK 版本不是越新越好,而是要和构建工具链匹配
VS Code 的 Java 工具链对 JDK 版本的要求比较明确:跑语言服务和构建工具本身需要较高版本的 JDK,但你的项目可能还钉在老版本上。比如项目是用 Java 8 写的,而你本机只装了新版本 JDK,直接打开项目往往会发现编译没问题但部分依赖解析异常,或者扩展提示“Java language server 需要更高版本”。
比较好的做法是同时维护两套 JDK,并通过设置 java.configuration.runtimes 分别注册,再在 .vscode/settings.json 里指定项目的默认运行时。我常用的配置长这样:
json复制{
"java.configuration.runtimes": [
{ "name": "JavaSE-1.8", "path": "/path/to/jdk8" },
{ "name": "JavaSE-17", "path": "/path/to/jdk17" }
],
"java.configuration.updateBuildConfiguration": "automatic",
"java.import.gradle.enabled": true,
"java.import.maven.enabled": true
}
这里有个容易绕晕的点:构建工具本身需要的 JDK 和项目编译目标版本是两码事。Gradle 需要 JVM 来运行守护进程,Maven 也需要 JVM 来跑插件;这些运行 JVM 的版本只要够新就行,具体编译到哪个 Java 版本由 sourceCompatibility、maven.compiler.source/target 或 Java 插件配置决定。所以如果你遇到“Gradle 同步失败,提示 JDK 版本不支持”,优先查 Gradle 运行环境,而不是项目编译配置。
2.2 扩展别自己拼装,优先用全套扩展包
很多教程会告诉你“只需要装 Maven for Java、Gradle for Java、Java 语言服务”这几个扩展,但实际踩下来,我建议直接装官方整合的 Java 扩展包,一次把调试、测试、语言服务、项目导入相关能力全部带齐。自己拼装容易遇到版本不匹配,比如语言服务刚升级到新版,而 Maven 扩展还停留在旧接口,就会出现在代码编辑区正常、但项目视图加载失败这种诡异状态。
装完之后,记得检查两件事。第一时间打开“扩展”面板看这几个组件是否都启用;第二在命令面板里执行 Java: Clean Java Language Server Workspace 前,先确认自己确实想清缓存。这个命令会把所有工作区的导入缓存删掉,下次打开项目要重新做一次全量导入。如果是小改动,更推荐用“Java: Reload Projects”这种轻量刷新。
2.3 工作区信任机制决定了构建脚本能不能执行
这可能是新手最容易忽略的一个点。VS Code 有工作区信任机制,当你打开从网上下载的或目录结构异常的项目文件夹时,会弹窗询问是否信任。如果没点信任,Java 语言服务和构建工具扩展根本不会执行项目导入,Maven 的 pom.xml 或 Gradle 的 build.gradle 也不会被真正加载。表现就是:左上角能看到文件,但整个项目视图一片空白,输出面板里只有一行“工作区不受信任”。
这不是 bug,是安全设计。构建脚本理论上可以执行任意命令,Maven 插件和 Gradle 任务都能触碰本地文件。所以我的建议是:自己的项目放心点信任,从别处拿来的尽量先看一遍 pom.xml 和 build.gradle 里有哪些插件,再决定要不要信任。毕竟构建工具一旦跑起来,它比编辑器本身权限大得多。
3. Maven 与 Gradle 的导入机制本质差异:一个靠静态解析,一个靠动态执行
3.1 为什么 Maven 项目导入快,Gradle 项目首次导入慢
用 Maven 和 Gradle 在同一个 VS Code 里做项目导入,速度差异非常明显,尤其是在中大型工程里。这个差异不是扩展开小差,而是两种工具的设计哲学决定的。
Maven 的核心是 pom.xml 这个声明式配置文件。它把依赖坐标、插件版本、模块关系统统用 XML 描述清楚,语言服务不需要执行任何构建逻辑,只要解析这个文件就能拿到一份相对完整的项目模型:源码目录在哪、依赖有哪些传递关系、输出目录叫什么、测试怎么跑。我把这叫做“静态解析路径”,类似查字典,翻到对应条目答案就出来。
Gradle 则完全不同。build.gradle 本质是一段 Groovy 或 Kotlin 脚本,它要被执行之后才知道项目长什么样。依赖是动态计算的,插件会改项目结构,个性化配置可能藏在 buildSrc 或初始化脚本里。语言服务自己没法安全地“看懂”这些脚本,只能通过 Gradle Tooling API 去调起一次真正的构建过程,从构建结果里提取项目模型。这就是为什么首次导入 Gradle 项目时你要等它跑任务、下载依赖、启动守护进程——教程里那种“打开即用”只适用于对构建脚本做粗粒度的读取。
这个差异直接决定了后续很多行为。Maven 项目里你改了 pom.xml 里的依赖,语言服务能迅速感知并做增量更新;Gradle 项目里你改了 build.gradle,往往需要手动执行一次项目刷新,因为脚本执行的结果可能完全变样——也许是一个新依赖加入,也许是把 task 的依赖关系彻底改掉。我不止一次见过有人困惑:“Maven 改完依赖自动就重新导入了,Gradle 怎么没反应?”这本质上就是动态脚本和静态配置的区别,理解了这一点,你就不会再抱怨扩展“不智能”了。
3.2 Enriched Model 与 Basic Model:项目模型完整度的两个档位
深入看导入过程,语言服务并不是一口吞下所有项目信息,它对构建工具会做多轮模型请求。其中最重要的一个概念是 Enriched Model——包括源码目录、每个模块的 classpath、依赖 jar 包路径、注解处理器配置等等完整信息。有了它,代码补全、跳转、诊断才能正常工作。
但有些情况下 Enriched Model 请求会失败,比如构建脚本里自定义逻辑过多、Gradle 守护进程内存不足、某个人仓库下载失败。这时语言服务会降级到 Basic Model,只能识别“哪几个目录是源码目录、哪个是测试目录”,拿到不到真正的 classpath 细节。直观表现就是:项目结构树还能看到,但一打开 Java 文件全是飘红,提示找不到这个包那个类。
排错的时候,可以先判断处于哪个档位。操作方法是输出面板切到“Java Language Server”,搜索 Project model 相关的日志;如果看到类似 getProjectMetadata 超时或返回空值,基本可以确定是模型获取失败。一般处理顺序是:先查构建脚本是否能在终端里独立跑通,再查依赖仓库是否可达,最后再考虑重置语言服务器缓存。不要一上来就用“Clean Java Language Server Workspace”,那样只会把问题拖到下次导入重新出现。
3.3 多模块工程的扫描策略差异
多模块项目里这两种工具的差异会被放大。Maven 的聚合关系通过父 pom.xml 的 <modules> 标签静态声明,语言服务可以直接解析出模块层级并一次性构建出所有子项目的模型。Gradle 则靠 settings.gradle 里的 include 语句来声明子项目,并且语言服务需要执行脚本才能发现模块列表。
这意味着 Gradle 多模块工程里如果 settings.gradle 写得不规范——比如用 file("...") 动态拼模块名,或者用循环生成 include——语言服务可能压根识别不出多模块结构。单模块或简单聚合项目问题不大,但只要上了三四个模块、又来回依赖,就建议在 settings.gradle 里把模块列清楚,宁可多写几行 include 语句,也别搞太多动态技巧。构建工具能跑通不代表 IDE 能正确建模,很多人被这点坑过。
4. 项目加载之后才是重头戏:重构建配置与任务执行的真实边界
4.1 Reload 和 Clean 之间的分寸感
日常开发中改动构建文件是常态。改依赖版本、加插件、调整模块结构,这些操作之后项目模型都过期了,需要触发重新导入。VS Code 里围绕着“重构建”有一组容易混淆的命令:
| 命令 | 作用范围 | 建议场景 |
|---|---|---|
| Java: Reload Projects | 重新加载所有构建工具导出的项目模型 | 改了 pom.xml 或 build.gradle 里的依赖、插件 |
| Java: Clean Java Language Server Workspace | 清空语言服务缓存,全部重新导入 | 模型文件损坏、一直飘红、扩展升级后有兼容问题 |
| Maven: Reload Projects | 仅针对 Maven 项目刷新 | 只改了 Maven 工程,不涉及 Gradle |
| Gradle: Refresh Gradle Projects | 仅针对 Gradle 项目重新同步 | 修改了 settings.gradle 或 build.gradle |
我的经验是:能用 Reload 就不用 Clean。语言服务缓存里存着类层次索引、导入结果等大量中间数据,一次全量清空意味着整个工作区要重新解析一遍,中大型项目动辄等好几分钟,而且期间代码补全和跳转全部不可用。只有一种情况我会直接 Clean:改了 pom.xml 后出现僵尸依赖——比如某个旧版本的类还在补全列表里,但编译时却提示找不到——这时候清一次缓存通常能解决。
4.2 构建任务的三种跑法:扩展按钮、命令面板、任务绑定
项目模型导入成功只是第一步,真正开发时你更常和“构建任务”打交道。Gradle 扩展会在侧边栏单独增加一个 Gradle 任务视图,所有 task 按模块分组列出来,点一下就能执行。Maven 项目则没有这么直观的任务树,更多是靠命令面板输入 Maven: Run,选对应的 goal。这种体验差异经常被人诟病,但理解原因就不奇怪了:Gradle 的任务机制本身就是构建一等公民,Maven 的 goal 和 phase 则是另一个套路。
如果你希望让构建动作在多个工程师之间保持一致,更好的方案是用 VS Code 任务系统,把构建命令封装成 .vscode/tasks.json。例如一个用 Maven 管理、后端模块叫 backend 的工程,我会配置:
json复制{
"version": "2.0.0",
"tasks": [
{
"label": "backend: package",
"type": "shell",
"command": "${workspaceFolder}/mvnw",
"args": ["-pl", "backend", "clean", "package", "-DskipTests"],
"group": "build",
"problemMatcher": ["$java.compile"]
}
]
}
这里有两个细节值得说。第一,我特意用 ${workspaceFolder}/mvnw 而不是全局安装的 mvn,这是为了让团队成员统一使用项目仓库里的 Maven Wrapper,避免本机 Maven 版本不一致导致构建结果漂移。第二,problemMatcher 配合构建输出,可以让编译错误直接以问题面板形式弹出来,点一下就能跳到对应源码行。这些细节单独看很小,组合起来才让 VS Code 用起来顺手。
4.3 Wrapper 是个被低估的工程规范
说到 Wrapper,这是我在所有项目里都坚持的规范。Maven Wrapper 和 Gradle Wrapper 都要求把一份固定版本的工具脚本和下载配置塞进仓库,任何人 clone 之后执行 ./mvnw 或 ./gradlew,用的都是同一个构建工具版本。
好处不止是消除环境差异。VS Code 里两个扩展默认也会优先找项目里的 Wrapper,找到之后构建导入用的就是 Wrapper 指定的版本。如果你的项目已经用了 Wrapper,而你再在系统里装了另一个版本的 Maven 或 Gradle,二者互不干扰。这在多项目并行开发时特别有用——一个项目在等 Gradle 7.6 才能跑,另一个项目已经切到 8.5,只要各自仓库里有 Wrapper,就不会打架。
5. 多模块与聚合工程的实测配置:几个真正让项目变“脆弱”的地方
5.1 典型多模块结构导入后的两种观感
我见过很多团队把代码拆成模块后,在 VS Code 里的表现和预期完全不一样。Maven 工程如果模块关系是 parent -> app, common, service,导入后 VS Code 的 Java 项目树会扁平展示这些子项目,并且语言服务会把每个模块的 classpath 串起来。Gradle 工程同样结构用 settings.gradle 声明后,任务视图里每个子项目是独立的 Gradle 单元,依赖关系也会体现在任务依赖里。
这两种观感没有谁更好,但要注意一个实操点:Gradle 多模块里子项目互相依赖时,语言服务能正确处理源码级别的跨模块跳转,前提是模型被完整导出。如果你改了模块 A 的接口签名,模块 B 仍然用旧签名做语法检查,通常是因为 B 的模型还没刷新。这时在命令面板执行一次 Gradle: Refresh Gradle Projects 往往比重启窗口更有效。
5.2 迁移到 VS Code 时的“隐性元数据缓存”问题
从其他 IDE 迁移过来的人最容易踩一个意想不到的坑:旧 IDE 会在项目目录里留下元数据文件。Eclipse 风格工程会有 .project、.classpath、.settings/,IDEA 会有 .idea/ 和 *.iml。VS Code 的 Java 扩展对某些 .classpath 文件也会读取甚至覆盖,如果旧文件内容和当前构建脚本不一致,就会出现“构建工具里依赖正常,但代码区飘红”的荒谬局面。
我的处理建议是:迁移项目到 VS Code 时,先把旧的 IDE 元数据目录清理干净,再做首次导入。特别是 .classpath 这种文件,它里面记录的 classpath 会被某些扩展当作“已验证的配置”直接采用,一旦它的内容和实际依赖对不上,飘红是必然的。清理之后语言服务才会老老实实从 pom.xml 或 build.gradle 重新生成模型。这算是个很小但能救命的经验。
5.3 Gradle JVM 参数与多模块大工程的取舍
多模块工程越来越大的一个典型症状是:项目导入过程中 Gradle daemon 内存暴涨,甚至直接崩溃。VS Code 里导入项目时 Gradle 扩展会用 Tooling API 调起 daemon,默认堆内存设置得比较保守,遇到四五个模块、大量第三方依赖时很容易 OutOfMemoryError。
解决方案是在用户设置里显式给导入进程分配内存:
json复制{
"java.import.gradle.jvmArgs": [
"-XX:MaxMetaspaceSize=1g",
"-Xmx4g",
"-Xms256m"
]
}
同时,建议在 gradle.properties 里设置 org.gradle.jvmargs=-Xmx4g,这样命令行构建和 IDE 导入用的是同一套内存策略。我实测过的一个场景是:模块从三个涨到七个之后,默认参数下导入成功率在八成左右,加了这两个配置后基本能稳定跑通。另外,多模块工程尽量别开太多其他插件任务,导入时 Gradle 会执行配置阶段的所有任务,某些插件只要存在就会明显拖慢整个过程。
6. 排错链路:从“项目没反应”到“飘红一片”的完整排查方法
6.1 第一条线:构建脚本本身能不能独立跑通
遇到任何 VS Code 里的 Java 项目导入问题,我第一反应永远是去终端里手动执行一次构建脚本,而不是盯在扩展设置里找原因。Maven 就 ./mvnw compile,Gradle 就 ./gradlew tasks。这一步能把问题范围瞬间切分干净——如果命令行都跑不通,那是工程本身的问题,和 VS Code 扩展无关;只有命令行能跑通、IDE 里却不正常的时候,才值得去翻扩展日志。
命令行能跑通但 IDE 失败,绝大多数情况出在“IDE 环境变量和 shell 不一样”上。比如你的 shell 里配置了 JAVA_HOME,但 VS Code 的进程继承的环境变量可能来自你的桌面环境,并不一定包含那个配置。核实方式很简单:输出面板里切到 Java Language Server 或 Gradle 相关频道,把显示出来的实际 Java 路径和项目要用的那一个对比一下,经常能发现问题。
6.2 第二条线:日志到底去哪翻
很多报错信息不会直接弹到你对外的界面上,但它们一定会在某个输出频道里出现。VS Code 里点击底部面板的“输出”标签,右侧下拉框里就能看到所有扩展的输出频道。我一般按优先级看这三个:
| 频道 | 主要作用 | 关键内容 |
|---|---|---|
| Java Language Server | 语言服务日志 | 构建模型请求结果、类路径更新、崩溃堆栈 |
| Maven for Java | Maven 扩展自身 | 导入过程、插件执行错误 |
| Gradle for Java | Gradle 扩展自身 | Tooling API 调用、守护进程连接、任务列表获取 |
如果你见过 Java Language Server 频道里出现 A JDK is not defined、Classpath is incomplete 这类关键词,基本就可以断定是 JDK 配置或模型导出问题。另外,VS Code 自己也有一个“日志(Window)”(旧版叫“日志(主进程)”)频道,扩展加载失败、清理工作区时的问题会出现在这里,容易被人忽略。
6.3 第三条线:命令面板里那几个“重置”级操作
当第二条线的日志也没给出明确线索时,我会按从轻到重的顺序依次尝试这几个操作:
Java: Reload Projects——刷新所有项目模型,动作最轻,但能解决大量依赖变更后没同步的问题。- 重新加载窗口(
Developer: Reload Window)——注意这并不会重新导入项目,只是让扩展重新加载,但对某些扩展状态卡死的问题有奇效。 Java: Clean Java Language Server Workspace——清空全部缓存,强制下一次全量导入。- 手动删除
.vscode外的target/、build/等构建产物目录,再执行重导入——这一步能消除某些增量构建造成的脏状态。
这个顺序设计的逻辑是:每往上走一级,付出的等待成本越高,但清理的顽固问题也越重。不要一开始就猛药。特别是 Clean 操作,在大型 Gradle 工程里做一次要等很久,如果只是配置文件改了一个依赖版本,完全不必走到那一步。
6.4 常见问题:正常版 JDK 下的反射访问限制
Java 9 引入模块系统之后,很多老三方库在运行时通过反射访问 JDK 内部 API 会抛 InaccessibleObjectException。这种情况在构建工具插件、注解处理器里很常见。VS Code 里表现为:代码能编译,但某次测试运行或构建任务执行到一半突然报模块访问错误。
处理方式是给构建工具的 JVM 参数加上开放模块设置。最常见的是在 gradle.properties 里配置:
properties复制org.gradle.jvmargs=-Xmx4g --add-opens=java.base/java.lang=ALL-UNNAMED
Maven 则在环境变量 MAVEN_OPTS 里加同样的参数。虽然这不是 VS Code 独有的问题,但因为在 IDE 环境下你看到报错却不知道怎么传 JVM 参数,反而比命令行直接复现要更难定位。
7. 把 VS Code 打造成 Java 主力开发环境:任务绑定、远程开发与团队规范
7.1 一个 workspace 同时管前后端和多个模块
VS Code 的多根工作区是 Java 开发里经常被低估的功能。我习惯于建立一个 项目.code-workspace 文件,把后端 Java 工程、前端工程、文档目录全部列进去。这样构建任务、搜索、源代码管理可以在同一个窗口里统一管理,而并不需要展开一个巨大的目录树。
Java 项目对 work 目录的边界其实比较敏感,如果你把明明不相干的几个目录强行塞进同一个工作区文件夹,语言服务会扫描到很多“不该属于这个项目”的源文件。正确做法是:后端 Java 多模块工程放在同一个工作区文件夹里,其他非 Java 目录单独列成其他文件夹,这样语言服务只解析 Java 相关的根目录,避免跨目录污染。
7.2 远程开发模式下构建工具扩展的职责转移
如果你经常需要在远程机器、容器或云主机上开发,VS Code 的远程开发方案值得认真考虑。本地 VS Code 窗口相当于一台显示器,真正的编辑、构建、语言服务都在远端跑。
这里有一个和 Maven/Gradle 支持密切相关的好处:远端环境可以把 JDK、Maven、Gradle 的版本完全固定一套,你本地不再需要为不同项目切换不同构建工具版本,直接通过远程打开工作区就能使用固定工具链。所有扩展在远程端运行时,读到的环境变量、JAVA_HOME、构建工具路径都是远端那套干净配置,省掉了大量本地多版本冲突问题。
我实际体验中最大的省心之处是:把项目的构建任务也配置成远程可执行后,团队里不管谁用什么本地系统打开同一个远程工作区,跑出来的构建行为完全一致。要做到这一点,前提还是前文说的 Wrapper 规范——./gradlew 脚本在远端执行时同样会锁定版本。
7.3 把常用构建动作压缩为按键级操作
VS Code 用久了你会慢慢形成自己的肌肉记忆。除了 Ctrl+Shift+P 命令面板,我强烈建议把最常用的构建动作绑定到快捷键或任务上。做法是在 keybindings.json 里给特定任务添加键位绑定,但我更常用的其实是把命令封装成带快捷键的任务:
json复制{
"key": "ctrl+alt+b",
"command": "workbench.action.tasks.runTask",
"args": "backend: package"
}
这样每次改完代码,一键起编译和打包。对 Java 这种编译型语言来说,“快速得到构建反馈”是提升开发节奏的关键——侧边栏点点点虽然也能跑,但多几次就明显觉得节奏被打断。这条建议不限于 Maven 还是 Gradle,任何构建工具都可套用。
7.4 团队规范:提交前先过 Wrapper 和设置同步
最后说一个容易拖累团队协作的细节。只要项目里有人直接用本机的 mvn 或 gradle,而不是仓库里的 mvnw、gradlew,就有可能出现“我这能跑你那里不能”的经典纠纷。VS Code 的 Maven/Gradle 扩展本身会优先识别 Wrapper,所以只要仓库里带了 Wrapper,IDE 层面的行为通常能保持一致。但如果团队里有人绕过扩展,直接在终端执行全局命令,问题就来了。
我见过最好的工程实践是把 .vscode/settings.json 纳入版本管理,并在里面把 java.configuration.updateBuildConfiguration、java.import.gradle.enabled 这些关键选项钉死,配合 Wrapper 一起形成团队约定。新手加入时打开项目就能用,不需要自己的额外配置,光这点就能省掉不少无意义的饭局式答疑。
8. 我的个人体会:稳定大于花哨,别把 VS Code 硬凹成传统 IDE
用 VS Code 做 Java 开发这几年,我最大的感受是:它不像传统 IDE 那样替你决定项目该怎么组织,而是把构建工具的能力比较忠实地暴露给使用者。Maven 和 Gradle 的支持深度其实不差,但前提是你得把构建工具本身用对。依赖走得保守一点、模块边界别搞太花、构建脚本少做魔法操作,VS Code 里的体验就会好很多。
我印象最深的一个翻车时刻是:有一次在模块工程里用动态代码生成模块 include 列表,命令行构建和打包都没问题,但 VS Code 的 Gradle 项目视图里只能看到根项目,所有子模块都消失不见。那天排查了大半天,最后把 settings.gradle 改回静态 include 列表,问题立刻消失,项目视图瞬间恢复正常。这个经历让我明白了一件事:IDE 对项目的理解是基于构建工具提供的模型快照,快照生不出来或者生成得太慢,IDE 再聪明也没用。越是能正常建模的工程,VS Code 的表现就越接近你预期。
所以如果你现在正纠结“要不要把团队 Java 工程挪到 VS Code 上来”,我的建议是先做两件事:把所有构建脚本在命令行里毫无报错地跑一遍;确认项目里都用了 Wrapper。这两条不过关,任何 IDE 都救不了你。过了这两条,VS Code 的轻量、快速、可脚本化优势就完全能释放出来。
最后再分享一个小习惯:我会在每个 Java 工作区的 .vscode 里放一份简化版 settings.json,只保留和项目导入强相关的选项,其余一概不动。扩展配置越少,排错时越容易想明白是哪一环出的问题。开发工具这东西,稳定压倒一切,少即是多。
