【VS Code】 Spring Boot `main` 方法不显示 Run | Debug 经验总结 VS Code Spring Bootmain方法不显示 Run | Debug 经验总结适用场景内网隔离环境无法访问repo.maven.apache.org通过内部 Nexus/Maven 私服拉取依赖。背景条件本文假设以下前置条件已满足VS Code 已安装Extension Pack for Java包含Language Support for Java (Red Hat)、Debugger for Java、Maven for Java、Project Manager for Java、Test Runner for JavaVS Code 已安装Spring Boot Extension Pack包含Spring Boot Tools、Spring Initializr、Spring Boot Dashboard以上扩展均已启用且版本正常无需重新安装或排查扩展问题JDK 已正确配置JAVA_HOME指向有效路径Maven 已正确安装命令行mvn --version可正常执行术语解释术语全称含义JDT LSJava Development Tools Language ServerEclipse 基金会维护的 Java 语言服务器VS Code 的Language Support for Java (Red Hat)扩展在底层运行它负责代码补全、编译诊断、项目构建等所有 Java 语言功能。它运行在独立进程中和命令行mvn是两个完全不同的进程M2EMaven to EclipseEclipse 生态的 Maven 集成组件JDT LS 通过它来读取pom.xml、解析模块结构和下载依赖。它有自己的 Maven 依赖解析逻辑CodeLens—VS Code 在代码行上方显示的嵌入式快捷操作如main方法上的 Run关键文件路径速查排查过程中涉及的所有文件及其在 Windows 上的绝对路径%USERPROFILE%即C:\Users\当前用户名文件路径用途项目根pom.xml项目根目录\pom.xmlMaven 项目描述文件用户级 Maven 配置%USERPROFILE%\.m2\settings.xml命令行mvn读取的用户配置可能不存在需手动创建全局 Maven 配置Maven安装目录\conf\settings.xmlMaven 安装时自带的全局配置本地 Maven 仓库%USERPROFILE%\.m2\repository所有 Maven 依赖的本地缓存目录VS Code 用户设置%APPDATA%\Code\User\settings.jsonVS Code 全局用户设置VS Code 工作区设置项目根目录\.vscode\settings.json项目级 VS Code 设置可能不存在JDT LS 工作区缓存%APPDATA%\Code\User\workspaceStorage\hash\redhat.javaJDT LS 项目模型缓存损坏时需删除现象主要现象SpringBootApplication类的main方法上方不显示Run | DebugCodeLens。常见伴随现象可能同时出现若干个伴随现象说明所有或部分pom.xml报红波浪线表示 JDT LS 无法解析 Maven 依赖Java 源文件 import 语句报红如import org.springframework...被标记为 “The import cannot be resolved”状态栏长时间显示Importing Maven project(s)或Building workspace项目导入卡住或异常缓慢Spring Boot Dashboard中不显示当前项目项目未被识别为 Spring Boot 项目JAVA PROJECTS面板中项目为空或无内容JDT LS 未建立项目模型输入代码时无自动补全或跳转语言服务功能全面失效CtrlShiftP→Java: List All Java Source Paths为空项目源码路径未被正确识别关键判断依据如果命令行mvn compile能成功但 VS Code 内报错说明 JDT LS 和 Maven CLI 之间存在隔离问题在 JDT LS 一侧。根因分析根据社区大量案例和实际排障经验此类问题通常由以下几个原因引发按概率排序原因 1内网特化JDT LS 未读取 settings.xml mirror → 直连 Maven Central 失败 → 缓存阻断占比最高内网无法访问 Maven Central → JDT LS 解析 POM 时直连 repo.maven.apache.org 失败 → 在本地仓库写入 .lastUpdated 缓存阻断文件 → 即使 POM 文件存在也标记为 present, but unavailable → 项目模型损坏module does not exist → CodeLens 消失本质JDT LS 内嵌的 Maven 解析器M2E默认不读取 Mavensettings.xml。修复方式是通过 VS Code 的java.import.maven.userSettings配置项显式指定settings.xml路径让 JDT LS 读取其中的mirror配置。一旦正确配置并清除旧缓存JDT LS 即可通过内网 mirror 正常解析依赖不需要修改pom.xml。原因 2通用VS Code 打开的不是正确的项目根目录VS Code 要求将包含根pom.xml的目录作为工作区根目录打开。常见错误打开的是父目录如打开了整个workspace文件夹而非workspace/project/在多模块项目中打开了子模块目录而非根目录使用File → Open File打开了单个 Java 文件而非Open Folder原因 3通用Maven 多模块项目中子模块未被正确识别典型场景根pom.xml的modules中声明了子模块但子模块目录不存在或名称不匹配导致整个 reactor 构建失败JDT LS 无法建立项目模型。原因 4通用java.configuration.runtimes中 JDK 版本与pom.xml中java.version不匹配或 JDK 路径失效%APPDATA%\Code\User\settings.json中配置的java.configuration.runtimes与实际使用的 JDK 不一致时会导致编译错误进而影响项目导入。原因 5通用JDT LS 工作区缓存损坏中途关闭 VS Code、磁盘空间不足、或 Maven 导入过程被异常中断可能导致%APPDATA%\Code\User\workspaceStorage\hash\redhat.java中的缓存不一致。原因 6偶发CodeLens 开关关闭%APPDATA%\Code\User\settings.json中java.debug.settings.enableRunDebugCodeLens:true常见错误示例错误 1parent POM “present, but unavailable”内网典型错误全量错误信息VS Code输出面板 →Language Support for JavaProject build error: Non-resolvable parent POM for groupId:artifactId:version: The following artifacts could not be resolved: org.springframework.boot:spring-boot-starter-parent:pom:X.X.X (present, but unavailable): failed to transfer from https://repo.maven.apache.org/maven2 during a previous attempt. This failure was cached in the local repository and resolution is not reattempted until the update interval of central has elapsed or updates are forced. Original error: 这是在主机名解析时通常出现的暂时错误 (repo.maven.apache.org)关键词present, but unavailable、failed to transfer、cached in the local repository排查路径打开%USERPROFILE%\.m2\repository\org\springframework\boot\spring-boot-starter-parent\版本号若存在*.lastUpdated文件说明 JDT LS 上次解析失败并写入了阻断标记即使该目录下*.pom正常存在.lastUpdated也会导致 JDT LS 将其视为不可用错误 2JDT LS 项目模型损坏全量日志VS Code输出面板 →Language Support for JavaError: module-name does not exist Java Model Exception: Error in Java Model (code 969): module-name does not exist排查路径此错误发生在 JDT LS 尝试获取模块的 main class 列表时根因是上一步 POM 解析失败导致 JDT LS 工作区缓存中存储的项目模型不完整查看当前工作区对应的 hash打开%APPDATA%\Code\User\workspaceStorage依次检查各子目录下的workspace.json找到包含当前项目路径的那个解决方案方案 A内网特化对应原因 1让 JDT LS 读取 settings.xml mirror 配置适用条件命令行mvn能正常编译但 VS Code 内 pom.xml 报红、错误日志中出现failed to transfer from https://repo.maven.apache.org。关键点JDT LS能够读取settings.xml但需要1通过java.import.maven.userSettings明确指定路径2工作区缓存未被上次失败污染。问题根源在于 JDT LS 的默认行为是不读取settings.xml但通过配置可以让它读取。修复后不需要在pom.xml中加任何仓库声明。Step 1— 创建或确认用户级 Maven 配置操作文件%USERPROFILE%\.m2\settings.xml?xml version1.0 encodingUTF-8?settingsxmlnshttp://maven.apache.org/SETTINGS/1.2.0xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://maven.apache.org/SETTINGS/1.2.0 https://maven.apache.org/xsd/settings-1.2.0.xsdmirrorsmirroridnexus-internal/idname内网 Maven Mirror/nameurlhttp://内网Nexus地址:端口/repository/maven-public//urlmirrorOf*/mirrorOf/mirror/mirrors/settings如果公司已有全局conf/settings.xml且中有内网 mirror也可直接把该文件复制到此路径。Step 2— 在 VS Code 中指定 settings.xml 路径操作文件%APPDATA%\Code\User\settings.jsonjava.import.maven.userSettings:%USERPROFILE%\\.m2\\settings.xml注意如果配置后仍无效说明 JDT LS 工作区缓存中残留了上次失败的项目模型必须执行 Step 3 清除缓存。Step 3— 清除阻断缓存 JDT LS 缓存然后重建详见方案 E删除%USERPROFILE%\.m2\repository中相关.lastUpdated文件执行Java: Clean Java Language Server Workspace或手动删除%APPDATA%\Code\User\workspaceStorage\hash\redhat.java完全退出 VS Code重新启动后用File → Open Folder打开项目根目录备选方案不推荐如果上述配置始终不生效可在项目根目录\pom.xml中直接追加repositories和pluginRepositories声明内网地址。此做法的缺点是侵入项目文件、影响团队协作仅建议作为最后手段。方案 B通用对应原因 2确认工作区根目录正确关闭 VS Code 中当前打开的所有文件夹用File → Open Folder重新打开包含根pom.xml的目录不要打开父目录或子模块目录如果项目包含多个独立子工程考虑使用.code-workspace多根工作区文件方案 C通用对应原因 3验证 Maven 多模块结构完整命令行执行mvn validate确认 reactor 中所有模块都BUILD SUCCESS确认根pom.xml的modules中列出的目录全部存在且包含子pom.xml如果有多余的模块声明或已删除的模块残留从modules中移除方案 D通用对应原因 4验证 JDK 配置检查%APPDATA%\Code\User\settings.json中java.configuration.runtimes配置java.configuration.runtimes:[{name:JavaSE-17,path:JDK 17 安装路径,default:true}]同时检查项目根目录\pom.xml中java.version与 JDK 版本匹配。运行mvn -version确认输出中的 JDK 版本与配置一致。方案 E通用对应原因 5/6执行缓存清理 重建Step 1— 清除.lastUpdated阻断缓存# 替换版本号为实际值Remove-Item-Recurse-Force $env:USERPROFILE\.m2\repository\org\springframework\boot\spring-boot-starter-parent\版本号Set-Location项目根目录 mvn dependency:resolve-UStep 2— 清除 JDT LS 工作区缓存二选一方式一VS Code 命令推荐CtrlShiftP→Java: Clean Java Language Server Workspace→ 选择Reload and delete方式二手动$wsDir$env:APPDATA\Code\User\workspaceStorageforeach($dinGet-ChildItem$wsDir-Directory){$jsonJoin-Path$d.FullNameworkspace.jsonif((Get-Content$json-Raw)-like*项目文件夹名*){Remove-Item-Recurse-Force(Join-Path$d.FullNameredhat.java)}}Step 3— 重启 VS Code完全退出 VS Code不光是Developer: Reload Window重新启动用File → Open Folder打开项目根目录等待状态栏Importing Maven project(s)→Building workspace全部完成打开*Application.javamain上方应出现Run | Debug综合排查流程1. 确认 VS Code 扩展已装 ↓ 已装 2. mvn compile 是否成功 ┌─ 否 → 修 Maven / JDK / 网络 / 仓库配置 │ └─ 是 → 3. pom.xml 是否报红 ├─ 是内网 → 方案 A配 settings.xml userSettings → 清缓存 │ └─ 否 → 4. 方案 B检查工作区根目录是否正确 ↓ 5. 方案 C检查多模块结构 ↓ 6. 方案 D检查 JDK 配置 ↓ 7. 方案 E清缓存 → 重启 → 验证自检清单Spring Boot、Java 相关 VS Code 扩展已完整安装命令行mvn compile在项目根目录下能成功执行VS Code 以File → Open Folder打开的是包含根pom.xml的目录%APPDATA%\Code\User\settings.json中enableRunDebugCodeLens为true%APPDATA%\Code\User\settings.json中java.configuration.runtimesJDK 路径正确内网环境%USERPROFILE%\.m2\settings.xml存在且有mirror配置内网环境%APPDATA%\Code\User\settings.json中java.import.maven.userSettings已指向上述 settings.xml%USERPROFILE%\.m2\repository中无对应.lastUpdated阻断文件执行过Java: Clean Java Language Server Workspace等待状态栏 “Building workspace” 完全结束后再检查*Application.java