境配置到斷點(diǎn)調(diào)試的高效開(kāi)發(fā)實(shí)踐)
1. 別再糾結(jié)了VS Code 跑 Spring Boot 完全可行很多習(xí)慣了 IDEA 的同學(xué)一聽(tīng)到用 VS Code 寫(xiě) Java 就搖頭。我當(dāng)年也是這么想的直到有次在輕薄本上開(kāi)會(huì)IDEA 啟動(dòng)要兩分鐘風(fēng)扇轉(zhuǎn)得跟起飛似的臨時(shí)改個(gè)接口參數(shù)都要等半天。那之后我認(rèn)真把 VS Code 的 Java 環(huán)境折騰了一遍才發(fā)現(xiàn)它比我預(yù)想的成熟得多?,F(xiàn)在我的日常開(kāi)發(fā)就是 VS Code 為主、IDEA 為輔特別是寫(xiě) Spring Boot 的小項(xiàng)目、Demo、接口測(cè)試VS Code 打開(kāi)快、內(nèi)存占用小體感非常舒服。這篇文章就把我踩過(guò)的坑和最終跑通的完整流程分享出來(lái)。你會(huì)在里面看到完整的擴(kuò)展安裝清單、環(huán)境變量配置、launch.json的寫(xiě)法以及各種奇怪報(bào)錯(cuò)的排查思路。無(wú)論你是剛接觸 Spring Boot 想找個(gè)輕量工具試試還是被 IDEA 的性能折磨得想換個(gè)環(huán)境這份實(shí)操筆記應(yīng)該都能幫到你。2. 為什么用 VS Code 跑 Spring Boot先解決“憑什么”的問(wèn)題2.1 VS Code 不是玩具它的 Java 支持早就過(guò)了及格線(xiàn)先說(shuō)點(diǎn)背景。VS Code 跑 Java 靠的是 Language Server Protocol語(yǔ)言服務(wù)器協(xié)議這套機(jī)制簡(jiǎn)單理解就是編輯器本身不解析 Java 代碼它把“理解代碼”這件事外包給一個(gè)后臺(tái)進(jìn)程也就是語(yǔ)言服務(wù)器。微軟和 Red Hat 合作的 Java Extension Pack 里核心就是 Red Hat 開(kāi)源的 Java Language Server。這個(gè)服務(wù)器負(fù)責(zé)代碼補(bǔ)全、定義跳轉(zhuǎn)、引用查找、錯(cuò)誤提示這些功能代替了 IDEA 里那一大坨索引和分析引擎。有一個(gè)最常見(jiàn)的誤解我必須澄清很多人以為 VS Code 寫(xiě) Java 只是“能打開(kāi)文件看看”實(shí)際上只要你把擴(kuò)展裝對(duì)、JDK 配好它的補(bǔ)全、重構(gòu)、調(diào)試能力和 IDEA 的差距遠(yuǎn)沒(méi)有想象中那么大。我實(shí)測(cè)過(guò)一個(gè)中型 Spring Boot 項(xiàng)目十幾個(gè)實(shí)體類(lèi)加幾十個(gè) ControllerVS Code 的跳轉(zhuǎn)和補(bǔ)全速度甚至比 IDEA 還快——因?yàn)?IDEA 索引大項(xiàng)目時(shí)會(huì)有明顯的延遲而 VS Code 按需加載。2.2 適合用 VS Code 的場(chǎng)景和人群我個(gè)人的使用體感是這樣的如果你是做微服務(wù)、多模塊大型工程或者重度依賴(lài) IDEA 的付費(fèi)插件生態(tài)那 VS Code 短期還替代不了 IDEA。但如果是下面這些場(chǎng)景VS Code 反而是更好的選擇筆記本配置一般啟動(dòng)項(xiàng)目頻繁受不了 IDEA 的內(nèi)存開(kāi)銷(xiāo)。主要通過(guò) Maven 構(gòu)建不需要太多圖形化的項(xiàng)目管理界面。項(xiàng)目里混雜了前端代碼、YAML 配置、Shell 腳本、Docker 文件VS Code 的多語(yǔ)言支持比 IDEA 更輕快。學(xué)習(xí) Spring Boot 階段想快速看到效果不想第一次就被 IDE 的復(fù)雜配置勸退。有遠(yuǎn)程開(kāi)發(fā)的習(xí)慣喜歡利用遠(yuǎn)程 SSH 插件直接改服務(wù)器上的代碼。另外說(shuō)個(gè)冷知識(shí)點(diǎn)VS Code 對(duì) Maven 多模塊項(xiàng)目的支持其實(shí)做得不錯(cuò)。只要安裝了 Maven for Java 擴(kuò)展它就能識(shí)別項(xiàng)目的模塊結(jié)構(gòu)在側(cè)邊欄里直接展示每個(gè)模塊的依賴(lài)關(guān)系。對(duì)于聚合工程來(lái)說(shuō)這個(gè)功能完全夠用了。3. 環(huán)境準(zhǔn)備裝齊三件套少走一半彎路3.1 JDK版本選不對(duì)后面全是淚Spring Boot 3.x 要求 Java 17 起步Spring Boot 2.x 用 Java 8 或 11 都行。我的建議是直接裝 JDK 17因?yàn)樗钱?dāng)前 Spring Boot 3 的主流版本而且絕大多數(shù)國(guó)內(nèi)公司的生產(chǎn)環(huán)境已經(jīng)切換到 17 了。如果你有老項(xiàng)目必須用 JDK 8也可以在 VS Code 里指定 Java 運(yùn)行時(shí)版本這個(gè)后面會(huì)講。安裝完 JDK 記得把環(huán)境變量配好。Windows 下要新建JAVA_HOME指向 JDK 的安裝根目錄然后在Path里加上%JAVA_HOME%\bin。macOS 和 Linux 則是在~/.zshrc或~/.bashrc里加export JAVA_HOME$(/usr/libexec/java_home -v 17)這類(lèi)配置有提示說(shuō)這里的路徑參數(shù)需要按實(shí)際 JDK 版本調(diào)整。這里有個(gè)非常容易踩的坑JDK 裝好了java -version也正常但 VS Code 里總是提示“Java runtime not found”。原因通常是 VS Code 的 Java 擴(kuò)展在啟動(dòng)時(shí)沒(méi)有正確讀取到環(huán)境變量。特別是 macOS 上GUI 應(yīng)用不會(huì)自動(dòng)繼承終端里的 shell 配置。解決辦法是先用which java找到 JDK 路徑然后在 VS Code 的settings.json里手動(dòng)指定下面會(huì)寫(xiě)具體配置。3.2 Maven不是必須裝但建議裝Spring Boot 項(xiàng)目一般都用 Maven 構(gòu)建。你可以在本機(jī)安裝獨(dú)立 Maven也可以直接用項(xiàng)目自帶的mvnwMaven Wrapper。我的習(xí)慣是本地裝一份 Maven再配置阿里云鏡像加速依賴(lài)下載。原因很簡(jiǎn)單mvnw首次運(yùn)行時(shí)要下載對(duì)應(yīng)版本的 Maven網(wǎng)絡(luò)不好反而更慢。Maven 裝好后同樣要配置MAVEN_HOME或M2_HOME環(huán)境變量。不過(guò) VS Code 的 Maven for Java 擴(kuò)展會(huì)自己找 Maven找不到時(shí)再在設(shè)置里手動(dòng)指定maven.executable.path就行。如果你用的是 IDEA 自帶的 Maven并且只想在 VS Code 里跑項(xiàng)目強(qiáng)烈建議把 Maven 單獨(dú)裝一份避免兩個(gè)工具搶同一個(gè)本地倉(cāng)庫(kù)出現(xiàn)版本沖突。3.3 擴(kuò)展安裝哪些必裝哪些裝了也是擺設(shè)打開(kāi) VS Code 的擴(kuò)展面板搜索Java Extension Pack這是微軟官方出的集合包里面包含六個(gè)擴(kuò)展。我建議第一次裝就裝這個(gè)集合包然后把下面這幾個(gè)留在啟用狀態(tài)擴(kuò)展名作用必備程度Language Support for JavaJava 語(yǔ)言服務(wù)器負(fù)責(zé)補(bǔ)全、跳轉(zhuǎn)、錯(cuò)誤提示必裝Debugger for JavaJava 調(diào)試器支持?jǐn)帱c(diǎn)、變量查看、調(diào)用堆棧必裝Maven for JavaMaven 項(xiàng)目管理和依賴(lài)解析必裝Project Manager for Java顯示項(xiàng)目結(jié)構(gòu)、類(lèi)路徑、依賴(lài)樹(shù)建議裝Test Runner for Java單元測(cè)試運(yùn)行和結(jié)果展示建議裝Spring Boot Extension Pack含 Spring Boot 工具、Spring Initializr 等跑 Spring Boot 必裝注意Spring Boot 項(xiàng)目還需要裝Spring Boot Extension Pack它里面包含了 Spring Boot 相關(guān)的配置提示、項(xiàng)目初始化向?qū)У?。不裝這個(gè)也能跑但裝了之后寫(xiě)application.yml會(huì)有配置項(xiàng)補(bǔ)全Controller 里也會(huì)多出一些 Spring 特有的代碼提示體驗(yàn)好很多。3.4 settings.json 里的關(guān)鍵配置裝完擴(kuò)展第一次啟動(dòng) Java 項(xiàng)目時(shí)VS Code 會(huì)彈通知提示配置 Java Home。如果彈窗沒(méi)出現(xiàn)或者你想手動(dòng)鎖定 JDK 版本可以打開(kāi)命令面板CtrlShiftP輸入Preferences: Open Settings (JSON)把下面這段加進(jìn)去{ java.configuration.runtimes: [ { name: JavaSE-17, path: /usr/local/jdk-17.0.5, default: true } ], maven.executable.path: /usr/local/maven/bin/mvn, java.compile.nullAnalysis.mode: automatic, java.debug.settings.hotCodeReplace: auto, java.debug.settings.vmArgs: -Xmx512m }java.configuration.runtimes數(shù)組里可以同時(shí)配置多個(gè) JDK 版本然后把其中一個(gè)設(shè)為default。如果你的機(jī)器上裝了 JDK 8 和 JDK 17想跑某個(gè)老項(xiàng)目時(shí)可以在這個(gè)配置里新增一條 JDK 8 的項(xiàng)然后在 VS Code 底部狀態(tài)欄點(diǎn)擊 Java 版本號(hào)快速切換。這個(gè)功能實(shí)測(cè)很穩(wěn)比在系統(tǒng)環(huán)境變量里來(lái)回改方便得多。4. 實(shí)操全過(guò)程從克隆項(xiàng)目到第一個(gè)請(qǐng)求返回4.1 導(dǎo)入項(xiàng)目的正確姿勢(shì)VS Code 打開(kāi) Spring Boot 項(xiàng)目有兩種方式。第一種是文件 - 打開(kāi)文件夾直接選擇項(xiàng)目根目錄。第二種是在命令面板里執(zhí)行Java: Import Java Projects in Workspace。兩種方式最終都會(huì)讓 Language Server 掃描類(lèi)路徑并生成依賴(lài)。我推薦用第一種簡(jiǎn)單直接。打開(kāi)后 VS Code 會(huì)自動(dòng)檢測(cè)到pom.xml右下角彈出“Java projects need to be imported”之類(lèi)的提示點(diǎn)擊確認(rèn)即可。如果你打開(kāi)項(xiàng)目后發(fā)現(xiàn)側(cè)邊欄沒(méi)有 Maven 模塊視圖別慌找到資源管理器下方的“Maven”面板刷新一下項(xiàng)目就會(huì)開(kāi)始解析依賴(lài)。首次解析會(huì)下載所有依賴(lài)包耗時(shí)取決于網(wǎng)絡(luò)速度和倉(cāng)庫(kù)鏡像配置通常三五分鐘起步。有個(gè)細(xì)節(jié)值得留意項(xiàng)目導(dǎo)入階段VS Code 的 CPU 占用會(huì)飆升這是轉(zhuǎn)儲(chǔ)類(lèi)路徑的正常現(xiàn)象。不要在這個(gè)時(shí)候強(qiáng)行關(guān)閉窗口否則可能留下?lián)p壞的索引緩存導(dǎo)致后續(xù)一直報(bào)找不到類(lèi)。4.2 首次運(yùn)行 Spring Boot 項(xiàng)目?jī)煞N啟動(dòng)方式方式一Maven 面板啟動(dòng)在 VS Code 側(cè)邊欄找到 Maven 面板展開(kāi)項(xiàng)目找到spring-boot:run這個(gè)命令它會(huì)自動(dòng)執(zhí)行 Maven 的 Spring Boot 插件并啟動(dòng)應(yīng)用。點(diǎn)擊后下方終端會(huì)輸出日志看到 “Started Application in X seconds” 就說(shuō)明啟動(dòng)成功了。這種方式適合剛接觸 Maven 的同學(xué)省心省力。但有一點(diǎn)要注意Maven 面板啟動(dòng)時(shí)命令行參數(shù)和 VM 參數(shù)的調(diào)優(yōu)余地不大如果你需要自定義 JVM 參數(shù)還是得回到命令行方式。方式二終端里 mvn spring-boot:run我更推薦這種方式因?yàn)槟隳苤庇^(guān)看到完整的 Maven 輸出和日志mvn spring-boot:run如果你用了 Maven Wrapper則執(zhí)行./mvnw spring-boot:run啟動(dòng)后訪(fǎng)問(wèn)http://localhost:8080正常情況下你應(yīng)該能看到 Spring Boot 的默認(rèn)錯(cuò)誤頁(yè)因?yàn)檫€沒(méi)配置任何接口或者你自己的首頁(yè)。如果你配置了 Spring Data JPA啟動(dòng)日志里會(huì)看到 Hibernate 建表語(yǔ)句之類(lèi)的輸出這些都是正常現(xiàn)象。這里補(bǔ)充一個(gè)很多人不知道的小技巧開(kāi)發(fā)環(huán)境中你可以直接在啟動(dòng)命令后面帶-Dspring-boot.run.profilesdev來(lái)指定使用application-dev.yml配置。比如mvn spring-boot:run -Dspring-boot.run.profilesdev如果你的項(xiàng)目有多個(gè)環(huán)境配置這個(gè)參數(shù)切換環(huán)境非常方便。4.3 重大更新VS Code 自帶的“運(yùn)行”按鈕新版 VS Code 針對(duì) Java 項(xiàng)目增加了運(yùn)行按鈕支持。當(dāng)你打開(kāi) Spring Boot 項(xiàng)目時(shí)編輯器右上角會(huì)出現(xiàn)一個(gè)三角形運(yùn)行圖標(biāo)。點(diǎn)擊它VS Code 會(huì)使用 Debugger for Java 擴(kuò)展來(lái)啟動(dòng)當(dāng)前主類(lèi)。這個(gè)功能的好處是不依賴(lài)終端直接啟動(dòng)并且會(huì)主動(dòng)識(shí)別SpringBootApplication注解標(biāo)記的入口類(lèi)。我用下來(lái)發(fā)現(xiàn)這個(gè)方式最大的優(yōu)點(diǎn)是啟動(dòng)成功后控制臺(tái)里會(huì)顯示進(jìn)程 ID、端口號(hào)、占用 CPU/內(nèi)存等信息調(diào)試起來(lái)非常清晰。但從終端啟動(dòng)的方式能讓你看到更完整的 Maven 構(gòu)建輸出各有利弊。我的習(xí)慣是日常寫(xiě)代碼調(diào)試用運(yùn)行按鈕需要看清楚構(gòu)建流程時(shí)用終端。4.4 配置數(shù)據(jù)源最容易被忽略的啟動(dòng)坑Spring Boot 項(xiàng)目最常見(jiàn)的啟動(dòng)失敗原因不是代碼寫(xiě)錯(cuò)而是數(shù)據(jù)源配置缺失或錯(cuò)誤。如果你項(xiàng)目引入了spring-boot-starter-data-jpa或spring-boot-starter-jdbc但application.yml里沒(méi)有配置數(shù)據(jù)庫(kù)連接啟動(dòng)時(shí)大概率會(huì)報(bào)錯(cuò)提示無(wú)法確定 DataSource 類(lèi)型。解決辦法有兩個(gè)在pom.xml里排除自動(dòng)數(shù)據(jù)源配置exclusions exclusion groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-data-jpa/artifactId /exclusion /exclusions在application.yml里配置一個(gè)最小可用的數(shù)據(jù)源spring: datasource: url: jdbc:mysql://localhost:3306/test?useUnicodetruecharacterEncodingutf-8serverTimezoneAsia/Shanghai username: root password: 123456 driver-class-name: com.mysql.cj.jdbc.Driver第二種方式更優(yōu)雅因?yàn)槟愫竺嬉B數(shù)據(jù)庫(kù)遲早要配置。注意MySQL 8 的驅(qū)動(dòng)類(lèi)名是com.mysql.cj.jdbc.Driver不是老版本的com.mysql.jdbc.Driver這個(gè)坑我踩過(guò)一次報(bào)錯(cuò)信息提示會(huì)讓你折騰半天。5. 調(diào)試斷點(diǎn)不只是 IDEA 的專(zhuān)屬能力5.1 寫(xiě)個(gè)最簡(jiǎn)單的斷點(diǎn)調(diào)試實(shí)例VS Code 的 Java 調(diào)試能力經(jīng)常被低估其實(shí)它支持完整的斷點(diǎn)調(diào)試、變量查看、調(diào)用堆棧、熱替換。下面我通過(guò)一個(gè)具體例子演示怎么操作。假設(shè)你有這樣一個(gè) ControllerRestController RequestMapping(/api/user) public class UserController { GetMapping(/{id}) public User getUser(PathVariable Long id) { User user new User(); user.setId(id); user.setName(測(cè)試用戶(hù) id); return user; } }啟動(dòng)調(diào)試模式后在return user;這一行左側(cè)點(diǎn)擊一下設(shè)置斷點(diǎn)然后瀏覽器訪(fǎng)問(wèn)http://localhost:8080/api/user/1VS Code 會(huì)自動(dòng)停在斷點(diǎn)處。左側(cè)面板會(huì)顯示所有局部變量的當(dāng)前值你可以展開(kāi)user對(duì)象查看字段內(nèi)容也可以通過(guò)右上角的步進(jìn)按鈕逐行執(zhí)行。調(diào)試時(shí)按 F5 啟動(dòng)、F10 單步跳過(guò)、F11 單步進(jìn)入、ShiftF5 退出這些快捷鍵和 IDEA 完全一致不需要重新學(xué)習(xí)記憶。5.2 launch.json自定義調(diào)試配置的精髓如果你需要自定義調(diào)試啟動(dòng)方式比如指定環(huán)境變量、調(diào)整啟動(dòng)端口、設(shè)置 Spring Boot 的 profile就需要寫(xiě)launch.json文件。在 VS Code 里按 CtrlShiftD 打開(kāi)調(diào)試面板點(diǎn)擊創(chuàng)建配置文件選擇 Java 環(huán)境VS Code 會(huì)自動(dòng)生成一份基礎(chǔ)配置。我改造后的配置如下{ version: 0.2.0, configurations: [ { type: java, name: 啟動(dòng)當(dāng)前Spring Boot應(yīng)用, request: launch, mainClass: com.example.demo.DemoApplication, projectName: demo, env: { SPRING_PROFILES_ACTIVE: dev, JAVA_OPTS: -Xmx512m }, args: --server.port8081 } ] }這個(gè)配置里mainClass指定入口類(lèi)env里通過(guò)SPRING_PROFILES_ACTIVE環(huán)境變量指定當(dāng)前加載的 profile 為 devargs里用--server.port8081把服務(wù)端口改成 8081。保存后調(diào)試面板里會(huì)出現(xiàn)一個(gè)“啟動(dòng)當(dāng)前Spring Boot應(yīng)用”的配置項(xiàng)點(diǎn)擊綠色播放按鈕即可啟動(dòng)。看明白了嗎VS Code 的調(diào)試配置夠靈活吧其實(shí)不比 IDEA 的 Run Configuration 弱。遇到端口沖突時(shí)直接在args里改端口就行不用動(dòng)代碼也不用改配置文件。5.3 熱替換的真相與限制Java 的 Hot Code Replace熱替換在 VS Code 里是默認(rèn)開(kāi)啟的。也就是說(shuō)調(diào)試運(yùn)行狀態(tài)下修改方法體內(nèi)部的代碼保存后無(wú)需重啟就能生效。但要記住一個(gè)限制新增方法、修改方法簽名、修改類(lèi)的繼承關(guān)系這類(lèi)結(jié)構(gòu)性變更不支持熱替換只能重啟應(yīng)用。我建議你在開(kāi)發(fā)階段把java.debug.settings.hotCodeReplace設(shè)為auto這樣 VS Code 可以在熱替換失敗時(shí)自動(dòng)切換為“強(qiáng)制重啟”模式省掉手動(dòng)重啟的麻煩。這個(gè)細(xì)節(jié)網(wǎng)上很少有人提到反正對(duì)我是很實(shí)用的。6. 多模塊 Spring Boot 項(xiàng)目的運(yùn)行細(xì)節(jié)6.1 認(rèn)識(shí) Maven 多模塊結(jié)構(gòu)真實(shí)項(xiàng)目里Spring Boot 很少是單模塊的。常見(jiàn)結(jié)構(gòu)是這樣parent-project ├── pom.xml (父POM管理依賴(lài)版本) ├── common-module (公共模塊實(shí)體類(lèi)、工具類(lèi)) ├── service-module (業(yè)務(wù)模塊Service、Mapper) └── web-module (Web模塊Controller、啟動(dòng)類(lèi))在 VS Code 里打開(kāi)父項(xiàng)目根目錄Maven for Java 擴(kuò)展會(huì)識(shí)別出所有子模塊。每個(gè)模塊在 Maven 面板里都能展開(kāi)并且 Language Server 會(huì)為每個(gè)模塊單獨(dú)記錄類(lèi)路徑。這個(gè)功能是自動(dòng)完成的不需要手動(dòng)配置。6.2 運(yùn)行子模塊的入口類(lèi)如果你要啟動(dòng)web-module模塊里的啟動(dòng)類(lèi)不用切換目錄直接在 VS Code 的 Java 項(xiàng)目中找到這個(gè)模塊右鍵運(yùn)行主類(lèi)即可。或者按 F1 調(diào)出命令面板輸入Java: Run Main Class選擇對(duì)應(yīng)模塊的Application類(lèi)。模塊之間的依賴(lài)關(guān)系在 VS Code 里也能看到。當(dāng)你修改了common-module里的實(shí)體類(lèi)保存后引用該模塊的web-module會(huì)收到編譯錯(cuò)誤或提示。這里有個(gè)注意點(diǎn)修改了公共模塊后需要讓 Maven 先安裝公共模塊到本地倉(cāng)庫(kù)才能保證其他模塊的類(lèi)路徑是最新的。命令行執(zhí)行mvn clean install -DskipTests如果漏掉這一步就會(huì)出現(xiàn)“明明改了代碼但另一個(gè)模塊報(bào)錯(cuò)找不到方法”這種靈異事件。6.3 多模塊的項(xiàng)目導(dǎo)入耗時(shí)過(guò)長(zhǎng)怎么辦項(xiàng)目模塊多了以后首次導(dǎo)入的耗時(shí)可能長(zhǎng)達(dá)十幾分鐘。這是因?yàn)?Language Server 需要編譯整個(gè)項(xiàng)目圖。解決辦法有兩個(gè)給 Maven 配置國(guó)內(nèi)鏡像加快依賴(lài)下載速度。在 Maven 的settings.xml里加入阿里云鏡像。把用不到的測(cè)試依賴(lài)單獨(dú)建一個(gè) profile避免全量解析。提到設(shè)置鏡像這個(gè)操作我順手貼一下配置片段放在 Maven 的conf/settings.xml里mirror idaliyunmaven/id mirrorOfcentral/mirrorOf namealiyun maven repository/name urlhttps://maven.aliyun.com/repository/public/url /mirror配好之后依賴(lài)下載速度會(huì)明顯提升。首次啟動(dòng)的等待時(shí)間能縮短一大半。7. 常見(jiàn)問(wèn)題與排查技巧踩過(guò)的坑逐個(gè)說(shuō)7.1 啟動(dòng)時(shí)報(bào)錯(cuò)找不到或無(wú)法加載主類(lèi)這個(gè)錯(cuò)誤絕大多數(shù)情況下不是 VS Code 的問(wèn)題而是項(xiàng)目的編譯輸出目錄和 Maven 的 target 目錄不一致。VS Code 使用自己的輸出目錄out來(lái)存放編譯結(jié)果如果你清除了編譯緩存或者用 IDEA 打開(kāi)過(guò)項(xiàng)目有可能導(dǎo)致 classpath 混亂。最直接的解決辦法是mvn clean compile然后回到 VS Code刪除所有輸出目錄workspace 存儲(chǔ)重新導(dǎo)入。在命令面板執(zhí)行Java: Clean Java Language Server Workspace這是清理工具實(shí)測(cè)能解決很多詭異的問(wèn)題。執(zhí)行完會(huì)重載窗口重新構(gòu)建索引。7.2 明明沒(méi)寫(xiě)錯(cuò)誤但紅波浪線(xiàn)一直在飄這個(gè)問(wèn)題通常是 Language Server 的狀態(tài)不同步導(dǎo)致的。Spring Boot 項(xiàng)目里application.yml中配置的屬性如果在代碼中引用了Language Server 有時(shí)會(huì)誤報(bào)“無(wú)法解析屬性”。我的排查經(jīng)驗(yàn)是這樣的先確認(rèn) Maven 依賴(lài)是否下載完整缺依賴(lài)時(shí) Language Server 會(huì)大量報(bào)錯(cuò)。再確認(rèn) JDK 版本是否匹配 Spring Boot 版本要求。Spring Boot 3 用 JDK 8 跑編譯器會(huì)報(bào)版本錯(cuò)誤。如果上面兩項(xiàng)都正常嘗試執(zhí)行命令Java: Reload Projects強(qiáng)制刷新類(lèi)路徑。如果是配置屬性誤報(bào)可以給啟動(dòng)類(lèi)加ConfigurationPropertiesScan注解或者直接用Value注入Language Server 一般就不再紅波浪了。7.3 端口被占用Address already in use開(kāi)發(fā)中最常見(jiàn)的啟動(dòng)失敗原因。排查方式netstat -ano | findstr :8080 taskkill /F /PID 進(jìn)程號(hào)macOS/Linux 則是lsof -i :8080 kill -9 PID然后重新啟動(dòng)。如果經(jīng)常遇到端口沖突可以在launch.json的args里固定一個(gè)不常用端口比如 8090。這樣能省掉每次改動(dòng)配置文件的麻煩。7.4 Lombok 不生效代碼全是紅色VS Code 的 Java 擴(kuò)展對(duì) Lombok 的支持默認(rèn)是開(kāi)啟的但偶爾會(huì)出現(xiàn)不生效的情況。檢查下面三個(gè)地方pom.xml中是否加了最新的 Lombok 版本。VS Code 窗口右下角是否提示安裝 Lombok 支持。運(yùn)行命令mvn clean compile后觀(guān)察是否恢復(fù)正常。如果還是不生效在settings.json中添加如下配置java.lombok.version: 1.18.28, java.lombok.lombokPath: ~/.m2/repository/org/projectlombok/lombok/1.18.28/lombok-1.18.28.jar注意版本號(hào)要和pom.xml里的一致。設(shè)置完重啟 VS Code 即可。7.5 項(xiàng)目導(dǎo)入后 Spring 相關(guān)注解不識(shí)別出現(xiàn)Autowired、Service等注解標(biāo)紅但項(xiàng)目能正常編譯運(yùn)行這種情況多數(shù)是 Language Server 對(duì) Spring 擴(kuò)展的加載出現(xiàn)了滯后。先看擴(kuò)展面板里Spring Boot Extension Pack是否已啟用然后執(zhí)行Java: Reload Projects。如果還有問(wèn)題把項(xiàng)目從工作區(qū)移除再重新加入通常就恢復(fù)了。7.6 控制臺(tái)輸出中文亂碼Windows 下比較常見(jiàn)。默認(rèn)編碼問(wèn)題導(dǎo)致控制臺(tái)日志里的中文變成亂碼。解決辦法是在launch.json里給當(dāng)前的調(diào)試配置添加一個(gè)控制臺(tái)選項(xiàng)console: integratedTerminal, vmArgs: -Dfile.encodingUTF-8同時(shí)在settings.json里設(shè)置terminal.integrated.defaultProfile.windows: Command Prompt, terminal.integrated.shellArgs.windows: [/K, chcp 65001]這個(gè)方法我實(shí)測(cè)有效。如果用的是 Maven 命令啟動(dòng)可以在.mvn/jvm.config文件中加入-Dfile.encodingUTF-8。8. 進(jìn)階建議讓 VS Code 真正成為日常主力8.1 善用命令面板效率翻倍VS Code 高度依賴(lài)快捷鍵和命令面板。開(kāi)發(fā) Spring Boot 項(xiàng)目時(shí)高頻操作主要有這些CtrlShiftP輸入Java: Run Main Class快速啟動(dòng)任意模塊的入口類(lèi)。CtrlShiftP輸入Java: Reload Projects刷新類(lèi)路徑依賴(lài)。CtrlShiftP輸入Spring Initializr: Create a Maven Project直接在當(dāng)前工作區(qū)生成一個(gè)全新的 Spring Boot 項(xiàng)目。CtrlShiftP輸入Java: Open Java Extension Pack查看所有 Java 擴(kuò)展的詳細(xì)文檔。我見(jiàn)過(guò)太多人只用鼠標(biāo)點(diǎn)來(lái)點(diǎn)去不熟悉命令面板白白浪費(fèi)了 VS Code 最強(qiáng)大的功能。8.2 擴(kuò)展推薦好用到飛起的配置除了官方擴(kuò)展之外下面這些擴(kuò)展也值得裝EditorConfig for VS Code統(tǒng)一項(xiàng)目代碼風(fēng)格。SonarLint實(shí)時(shí)提示代碼質(zhì)量問(wèn)題包括安全漏洞。YAMLapplication.yml文件的格式化、校驗(yàn)、補(bǔ)全。Docker配合docker-compose.yml啟動(dòng)本地中間件。GitLens查看代碼提交歷史、Git blame排查問(wèn)題利器。注意擴(kuò)展不是越多越好裝多了會(huì)拖慢 VS Code 啟動(dòng)速度。每個(gè)擴(kuò)展占用的內(nèi)存和解析時(shí)間會(huì)疊加所以建議只裝真正用得到的。8.3 元件的性能調(diào)優(yōu)VS Code 卡頓排查VS Code 本身占用內(nèi)存不大但運(yùn)行 Java 語(yǔ)言服務(wù)器時(shí)內(nèi)存會(huì)漲到幾百 MB。如果項(xiàng)目很大建議在settings.json中限制 Java 語(yǔ)言服務(wù)器的堆內(nèi)存java.server.launchMode: Standard, java.server.vmargs: -Xmx1024m -XX:UseParallelGC另外VS Code 的 workspace 存儲(chǔ)目錄Windows 下是%APPDATA%\Code\User\workspaceStorage里塞滿(mǎn)了很多項(xiàng)目緩存時(shí)間長(zhǎng)了會(huì)拖慢整體性能。建議定期清理這個(gè)目錄讓 VS Code 重新建立索引。我一般一個(gè)月清理一次清理之后明顯感覺(jué)輕快不少。8.4 遠(yuǎn)程開(kāi)發(fā)另一種高效工作流如果你是在公司服務(wù)器上開(kāi)發(fā)或者習(xí)慣用云主機(jī)跑應(yīng)用VS Code 的 Remote SSH 插件幾乎是神器。本地寫(xiě)代碼遠(yuǎn)程服務(wù)器編譯運(yùn)行所有依賴(lài)都裝在云端本地電腦不需要高性能硬件。具體流程安裝Remote - SSH擴(kuò)展配置好 SSH 訪(fǎng)問(wèn)信息連接遠(yuǎn)程主機(jī)然后在遠(yuǎn)程 VS Code 窗口里打開(kāi)項(xiàng)目。遠(yuǎn)程環(huán)境下 Java 擴(kuò)展一樣能用補(bǔ)全、調(diào)試、斷點(diǎn)全部支持只是代碼解析在云端完成。這種方式對(duì)筆記本用戶(hù)尤其友好電腦溫度會(huì)低很多。9. 一些操作心得和習(xí)慣建議在多次使用 VS Code 跑 Spring Boot 的過(guò)程中我總結(jié)了一些屬于自己的習(xí)慣這些都是慢慢摸索出來(lái)的并不代表最優(yōu)解僅供參考。第一我習(xí)慣給每個(gè)分支項(xiàng)目單獨(dú)設(shè)置一個(gè) VS Code 窗口。Spring Boot 項(xiàng)目多分支切換時(shí)同一窗口內(nèi)重新加載類(lèi)路徑很慢而新開(kāi)窗口可以讓 Language Server 重新構(gòu)建索引不容易出現(xiàn)舊編譯信息干擾的問(wèn)題。第二命令行啟動(dòng)和調(diào)試啟動(dòng)交替使用。日常驗(yàn)證代碼邏輯時(shí)我更傾向直接點(diǎn)擊運(yùn)行按鈕快速啟動(dòng)需要分析依賴(lài)、查看構(gòu)建細(xì)節(jié)時(shí)切到終端執(zhí)行mvn spring-boot:run -X查看 Maven 的調(diào)試輸出。-X參數(shù)會(huì)輸出 Maven 的完整調(diào)試日志排查依賴(lài)沖突時(shí)非常有用。第三關(guān)于斷點(diǎn)調(diào)試我習(xí)慣在 Controller 的入口和關(guān)鍵業(yè)務(wù)方法各打一個(gè)斷點(diǎn)再配合 VS Code 的變量面板查看數(shù)據(jù)變化。遇到問(wèn)題時(shí)先從調(diào)用棧底部往上定位大部分 bug 都能在半小時(shí)內(nèi)解決。第四是事件日志習(xí)慣。Spring Boot 的啟動(dòng)日志默認(rèn)包含很多 debug 信息開(kāi)發(fā)時(shí)不需要每次都全量輸出。建議在application.yml里把logging.level設(shè)置為合適的級(jí)別比如只打印項(xiàng)目包名下的 INFO 日志其他第三方庫(kù)保持 WARN這樣日志清爽很多。說(shuō)到底工具終歸是工具。IDEA 很強(qiáng)大VS Code 很輕量誰(shuí)也不必替代誰(shuí)。如果你還在猶豫要不要換我的建議是先拿一個(gè)小項(xiàng)目試試跑通一個(gè)完整的 Spring Boot CRUD 流程你自然會(huì)有答案。