Spring Boot热部署实战:DevTools、自动重启与热加载方案全解析
1. 为什么说 Spring Boot 热部署是开发体验的分水岭先聊一个很多 Java 开发者都经历过的场景你在一个 Controller 里改了个接口的返回值然后按下 CtrlF10 或者重启应用等待漫长的启动日志刷屏。如果项目稍微大一点启动时间几十秒是家常便饭碰到微服务架构里要起好几个服务一次改动到验证结果基本就要一两分钟。刚开始还能忍时间久了那种改一行代码、等半分钟的割裂感会严重拉低写代码的流畅度。热部署就是来解决这个痛点的。它的核心思想不难理解只重新加载有变动的部分而不是每次把整个应用重新启动一遍。你在 IDE 里保存代码应用自动完成编译、类替换、上下文刷新整个过程几乎无感。这样改完立刻看效果的反馈循环一旦建立起来开发效率的提升是肉眼可见的。我第一次接触 Spring Boot 热部署是在一个接手的老项目里那会儿项目的实体类、仓储层、服务层耦合得很厉害冷启动要 40 多秒每次改完接口联调都像在做耐力测试。后来把热部署工具接进去主要开发阶段的编译时间压到了 1 到 3 秒联调节奏立刻就不一样了。这篇文章我会把 Spring Boot 热部署的几种主流方案、各自原理、适用场景和实际踩坑经验整理出来主要给正在做 Spring Boot 开发、又觉得频繁重启太浪费时间的朋友参考。先说结论热部署不是一个高级技巧而是实实在在的开发工具。你不需要等碰到大型项目才开始用哪怕你只是一个刚学 Spring Boot 的新手这套东西也能让你做练习时的反馈速度快很多。下面我会从原理讲起再逐个方案实操最后把我遇到过的坑和排查思路完整列出来。2. 先搞清楚机制热部署、热加载、自动重启到底有什么区别很多教程把热部署当成一个笼统的词但其实它背后至少包含三条不同的技术路线。搞清楚这些区别你才知道自己的项目适合用哪种方案。2.1 这三条路线的本质差异热部署Hot Deploy通常指应用运行状态下动态替换已经加载的类甚至改变类结构、方法签名然后由容器或框架完成状态迁移。这是最理想的状态但实现难度也最高。热加载Hot Load指把新编译的 class 文件加载到 JVM替换旧类但往往要求类结构不能发生破坏性变化。JRebel 这类商业工具走的就是这条路线能处理绝大多数日常改动。自动重启Restart本质上是应用监听文件变化后用一个全新的类加载器重启应用上下文。Spring Boot DevTools 里的restart就是代表。它比热加载要重一些但胜在稳定、免费、和框架无侵入。2.2 自动重启背后的原理两个类加载器的把戏Spring Boot DevTools 的实现很有意思。它维护了两个类加载器base classloader和restart classloader。你在项目里写的类、配置文件由restart classloader负责加载而依赖的第三方 jar 包比如 Spring 框架本身、各种 starter则丢给base classloader。当你修改代码后DevTools 检测到变更会丢弃掉旧的restart classloader新建一个来加载新编译的类。因为真正庞大的第三方依赖没有重新加载所以重启速度远快于冷启动。实测下来一个 20 到 30 个依赖的中型项目冷启动 25 秒左右开启 DevTools 后重启基本在 3 到 6 秒之间。注意自动重启不是原地复用旧对象而是整个 Spring 容器重新初始化。只是省掉了 JVM 启动、依赖加载这两个大头所以速度快。2.3 热加载和自动重启的边界用 JRebel 这类工具时很多改动是完完全全的类替换不需要重建容器所以速度可以做到 1 秒内。但它也有自己的限制类结构的大改比如新增字段尤其是涉及序列化、持久化映射的逻辑偶尔需要刷新一次完整重启才能保证状态正确。自动重启则相对粗犷只要 classpath 里的文件变了就重新加载类、重建 Bean、重跑初始化逻辑。代价是部分上下文状态比如存在内存里的 Session、缓存数据会丢失。这也是为什么 DevTools 只建议在开发环境用别在生产环境开着。3. 方案一Spring Boot DevTools绝大多数项目的首选如果让我给第一次接触热部署的人推荐方案我只会说一个词DevTools。它是 Spring Boot 官方的开发期组件零成本、和 spring-boot-maven-plugin 配合得好、配置简单而且坑相对最少。3.1 接入步骤和依赖新建一个 Spring Boot 项目或者在已有项目里加依赖基本就是拷一段配置dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-devtools/artifactId optionaltrue/optional /dependencyoptional设置为 true 很关键这是为了让依赖不会传递到使用你项目作为依赖的其他模块。在 IDEA 里如果你用 Spring Initializr 创建项目勾选 Developer Tools 那一栏即可。依赖加上之后启动项目你会发现日志里多了类似LiveReload server is running on port 35729的信息CtrlShiftF9 手动编译一下当前类应用自动就重启了。习惯了之后基本不会再去手动点按钮。3.2 触发条件不是改了所有文件都会重启DevTools 默认对 classpath 下的文件变化敏感但并不是所有变化都会触发重启。它内部有一套白名单和排除名单比如触发重启/META-INF/maven/**、/META-INF/resources/**、/resources/**、/static/**、/public/**、/templates/**等目录下的变化。不触发重启/META-INF/spring-configuration-metadata.json、/META-INF/spring-devtools.properties这类文件。这意味着你修改application.yml时DevTools 的restart功能并不一定会触发。但这不代表配置文件不生效——它走的是另一条LiveReload加属性加载的机制Spring Boot 的ConfigurationProperties支持动态刷新只是不会重建整个上下文。实际开发中很多人遇到改了 yml 没反应的困惑就是不知道这个机制。我的建议是配置文件改动后如果确认需要完整重启手动重启用得少更常用的是配合spring.devtools.restart.enabled和spring.devtools.restart.additional-paths来做更精细的控制。3.3 常用配置项和注意事项下面这几个配置项是我日常用得比较多的# 关闭自动重启常用于远程调试或特殊场景 spring.devtools.restart.enabledfalse # 额外监听目录比如别的模块生成的 class 目录 spring.devtools.restart.additional-pathssrc/main/java # 排除某些文件的变更触发重启 spring.devtools.restart.excludestatic/**,public/**有一点要特别注意DevTools 在 IDEA 里默认是能自动触发的但 Eclipse 用户往往需要配合编译设置。IDEA 里如果发现改了代码不自动重启先确认两个地方是否开启了Build project automatically设置里搜auto。是否开启了Allow auto-make to start even if developed application is currently running键位设置里搜auto-make相关项。我以前碰到过一个很隐蔽的情况明明 DevTools 依赖加了设置也开了但改了 Controller 就是不自动重启。后来发现是项目里spring-boot-maven-plugin配置了forktrue/fork而 DevTools 在非 fork 模式下有时不接管启动流程。把 fork 关掉或者确保以spring-boot:run启动就没问题了。4. 方案二IDEA 的本地热部署能力适合轻量级项目不引入任何第三方依赖时IDEA 自带的 Hot Swap 也能做到一部分热替换效果就是调试模式Debug下的Build - Recompile。但它的限制非常多只支持方法体的修改、常量修改不支持新增方法、新增字段、修改类签名。说实话这种能力只适合改 bug 时快速验证当不了生产主力。4.1 和 DevTools 配合使用是最舒服的状态我现在的日常开发流程是这样的IDEA 开着 Debug 模式启动 Spring Boot同时依赖 DevTools。改方法体内的代码IDEA 的 JVM Hot Swap 直接替换几乎感知不到改类结构、新增方法DevTools 发现 class 变了自动重启。两者分工明确反馈速度最大化。这里有个小经验Debug 模式和 DevTools 同时开启时注意断点行为。DevTools 重启后断点仍然保留在源码位置上基本不用重新设置。但如果涉及 Spring 容器的初始化过程部分断点可能在重启瞬间失效需要等容器起来后再打上。4.2 为什么不推荐只靠 IDEA 热部署只靠 IDEA 的 Hot Swap你没法处理这些情况新增一个 Controller 类。修改了实体类的字段牵涉到 MyBatis 或 JPA 的映射。修改了Configuration类里的 Bean 定义。这些改动即便在 IDEA 里重新编译也不会生效必须手动重启。所以如果你想要改啥都生效的体验DevTools 的自动重启仍然不可替代。5. 方案三JRebel 类热加载工具性能最强但要注意许可问题JRebel 这类商业工具走的是类热加载路线官方宣传的Work on code changes instantly并非虚言。使用体验上修改 Controller 方法、新增 Service 方法切回浏览器刷新基本立即可见没有容器重建过程。但是这里我必须提醒一句JRebel 本身是收费的商业软件网上流传的破解版、所谓永久激活都涉及未授权使用存在法律风险和安全隐患。我一直以来的态度都是个人学习可以用官方提供的试用期公司项目如果确实需要应该走正规授权采购流程。这也是为什么我在这篇文章里把 DevTools 放在首推位置——不是因为它功能最强而是它最省心、最合规。如果你所在的团队已经在用 JRebel简单补充几个配置经验开启 JRebel 的 IDE 插件后它会接管启动流程注意启动日志里有没有JRebel Agent相关字样。新增静态资源、模板文件JRebel 处理起来很顺但某些场景比如修改logback.xml未必能自动生效最好实测一次再依赖它。一个很常见的问题JRebel 和 DevTools 同时开启时可能互相抢占类加载逻辑建议只用一个。让我选的话用 JRebel 就不开 DevTools。6. 再进阶一层Docker 开发容器里的热部署思路现在很多团队已经把本地开发环境迁到了 Docker 里Spring Boot 跑在容器中宿主机改代码。这种情况下DevTools 的自动重启还能不能用答案是能但要注意目录同步。6.1 核心思路把 class 目录和资源目录挂载进容器DevTools 监听的是容器内的 classpath 目录变化所以只要你把宿主机编译输出的target/classes挂载到容器的对应位置再配合一个构建工具比如 Maven 的mvn compile在宿主机上监听文件变化就能实现宿主机改代码、容器内自动重启的效果。一个最小化的 docker-compose 片段大概是这种感觉services: app: image: openjdk:17 ports: - 8080:8080 volumes: - ./target/classes:/app/classes - ./src/main/resources:/app/resources command: java -cp /app/classes:/app/resources com.example.Application这里我没有放完整配置因为不同项目差异很大。但思路是通用的让宿主机和容器共享同一个 classpath 目录容器内启动的应用自然就能感知到文件变化。6.2 开发镜像不要和生产镜像共用一个经常被忽略的点加了热部署的镜像和在生产用的镜像应该是两套构建产物。开发镜像可以包含spring-boot-devtools依赖、挂载源码目录、甚至暴露调试端口生产镜像则是精简后的 fat jar不包含任何开发工具。你可以利用 Maven profile 来区分profiles profile iddev/id dependencies dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-devtools/artifactId /dependency /dependencies /profile profile idprod/id /profile /profiles这样打包-Pdev时带上 DevTools打包-Pprod时完全排除既保留开发体验又避免生产环境出现热部署带来的安全隐患。7. 实际踩坑记录热部署不生效的三个典型案例写这类文章如果不讲踩坑过程总觉得缺了什么。下面三个问题是我自己在不同项目里真实遇到的也是社区里问得最多的。7.1 案例一DevTools 依赖生效但改动类就是不触发重启现象日志里已经出现Restarting due to changes in ...IDEA 配置也正常但新增方法后调用还是报旧代码逻辑。排查链路先确认触发的是不是 DevTools 的重启看启动日志里有没有LiveReload server和Restarting字样。再确认编译产物是否更新在target/classes目录下找对应的 class 文件看时间戳。如果时间戳没变说明 IDEA 没触发编译问题出在 IDE 的自动编译设置。最后看类的加载来源在高并发或复杂工程里可能出现依赖模块的 class 也被打进了 fat jar导致容器里的类来自 jar 而非target/classes。这种情况 DevTools 无力回天只能把依赖模块改为本地模块依赖而不是 jar 依赖。那次我卡了很久的就是第 3 点一个多模块工程里B 模块通过 jar 方式依赖 A 模块而 A 模块的代码改动根本没进到 B 的运行 classpath 里。解决方式是改用 IDEA 的模块依赖让两个模块在同一构建里用源码参与编译。7.2 案例二改了application.yml不生效现象代码改动可以自动重启但改配置文件后应用没有重启新配置没有生效。这其实就是前面提到的机制问题——DevTools 对配置文件的处理和 classpath 下的类文件不一样。application.yml属于资源文件DevTools 默认对资源变更不触发自动重启但可以通过配置让它对某些目录敏感spring.devtools.restart.additional-pathssrc/main/resources加上之后改 yml 也会触发重启。但也别高兴太早如果你用了 Spring Cloud Config 这种外部配置中心热重启的优先级会变得复杂那时候更建议手动刷新配置或者依赖专门的配置热更新机制。7.3 案例三DevTools 导致内存溢出或频繁重启现象开发环境发生频繁重启、内存飙高。排查链路DevTools 每次重启都会创建新的类加载器旧的类加载器如果没有被回收就会出现所谓的永久代/元空间泄漏。常见诱因是项目里用了一些静态持有类引用的框架或者自定义的线程池没有清理干净。还有一种是文件监听太敏感IDEA 在自动保存时会连续多次触发文件变更事件DevTools 会做一定的去重但某些版本的组合下会连续重启好几次。这类问题我最终的解决办法分两步把spring.devtools.restart.trigger-file指向一个自定义 trigger 文件比如.devtools-trigger只有这个文件变化时才触发重启。在切换分支、大批量同步代码时干脆手动关闭 DevTools等文件稳定后再启动。8. 热部署在微服务和遗留项目里的使用心得8.1 微服务架构下热部署帮不上跨服务的忙微服务开发里常常有一个误解以为热部署能解决所有改动。但服务 A 改了接口服务 B 的调用方要重新生成 Feign 客户端代码、或者刷新注册到注册中心的元数据这些远不是一个类热加载能做到的。DevTools 只对当前应用进程内的类生效跨服务、跨进程的联动逻辑必须依靠契约测试、API 版本管理和统一的构建流程。所以在微服务团队里我会建议把热部署定位为单服务内部开发提速工具而不是全链路联调的银弹。真正要加速微服务联调应该去关注契约测试、本地 mock 或者服务网格这类方案。8.2 遗留项目接入热部署前先检查三点老项目接入 DevTools 偶尔会出现比冷启动还慢的情况原因多半是初始化逻辑太重数据迁移脚本、批量缓存预热、定时任务启动扫描。DevTools 重启会把这些逻辑重新跑一遍所以如果项目启动时就干了 10 秒的初始化工作热部署的收益会被抵消。接入前建议先检查启动过程是否有大量磁盘 IO 或网络调用比如连远程数据库做校验。是否有内存态数据被频繁初始化。是否有第三方 Agent比如 APM、字节码增强工具在启动时做额外的扫描。如果第 1 点很重先考虑优化启动时间比接热部署更划算。如果第 3 点存在热部署和字节码增强工具冲突的风险会明显升高。8.3 多模块项目的特殊处理多模块项目里DevTools 默认 devtools 依赖只在一个模块加其实不够建议在需要热部署的每个启动模块都加上并在公共模块里用optionaltrue避免传递。另外公共模块的代码改了以后必须确保它重新编译并输出到启动模块的target/classes里。用 IDEA 时直接在依赖设置里把公共模块设为模块依赖而不是 jar 依赖能省很多事。9. 关于热部署的最终建议热部署不是高深莫测的黑魔法它就是一套建立在类加载机制之上的开发工具链。选择方案时我的思路其实很简单默认首推 Spring Boot DevTools官方维护、免费、和 Spring Boot 集成度最高99% 的开发场景都能覆盖。IDEA Debug 模式做辅助方法体级别的快速修改交给 JVM Hot Swap。JRebel 类工具确实强但涉及许可问题正规途径评估成本和收益再说不建议碰任何破解渠道。Docker 开发环境需要额外规划目录挂载和镜像分层。另外无论选哪个方案都要明确一点热部署只服务开发环境生产环境必须保持完整的构建、启动、验证流程。别因为开发时太顺就把热部署带到了不该出现的地方。我在实际使用中还有一个习惯改代码前先想想这次改动会不会影响类的结构、Bean 的定义、或者第三方库的状态。如果是就干脆手动重启等 DevTools 重新把上下文拉起来后再验证。这个习惯看起来有点保守但能少踩很多明明热部署了结果状态不对的坑。

相关新闻

稀疏、密集、二进制向量选型与Milvus实战全解

稀疏、密集、二进制向量选型与Milvus实战全解

做向量检索这几年,我接到最多的一个问题不是"Milvus 怎么用",而是"我到底该用稀疏向量、密集向量还是二进制向量"。很多人默认三种向量只是精度和存储的取舍,实际完全不是一回事——稀疏、密集、二进制对应的是三种不同的…

2026/10/12 8:43:29 阅读更多 →
cli-continues会话管理5大命令:list、scan、inspect、dump、rebuild使用清单

cli-continues会话管理5大命令:list、scan、inspect、dump、rebuild使用清单

【免费下载链接】cli-continues resume any AI coding session in another tool — Claude Code, Copilot, Gemini, Codex, Cursor 项目地址: https://gitcode.com/gh_mirrors/cl/cli-continues 点击查看 免费下载 cli-continues(npm 包名 continues&am…

2026/10/12 8:42:27 阅读更多 →
为对话模型装上持久记忆:claude-mem本地记忆增强工具原理与实践

为对话模型装上持久记忆:claude-mem本地记忆增强工具原理与实践

1. 它是做什么的:一个给对话工具装上记忆的中间层 如果你经常用 Claude 这类对话模型处理长周期任务,大概率遇到过同一个尴尬局面:上下文窗口明明还没撑爆,但模型已经把三天前你交代的关键背景忘得一干二净。尤其是跨会话的场景—…

2026/10/12 8:42:27 阅读更多 →

最新新闻

基于模型压缩的识别算法Python源码:蒸馏与剪枝实战

基于模型压缩的识别算法Python源码:蒸馏与剪枝实战

简介:这份资源是面向高校毕业设计与深度学习入门者的模型压缩识别算法Python源码包,聚焦知识蒸馏与剪枝两类主流压缩技术,帮助读者在有限算力下完成识别模型的轻量化改造与对比实验。包内共185个文件,以79个py源码为核心&#xff…

2026/10/12 10:02:52 阅读更多 →
小波神经网络在光伏辐照预测中的工程落地实践

小波神经网络在光伏辐照预测中的工程落地实践

简介:本资源是一篇发表于《可再生能源》期刊的学术论文,面向新能源、电力系统、人工智能交叉领域的研究者与工程技术人员,聚焦太阳能发电中关键的超短期辐照强度预测难题。论文提出一种融合小波分析与神经网络优势的WNN模型,针对春…

2026/10/12 10:02:52 阅读更多 →
数学证明的事件化记录:构建可追溯、可验证的AI推理过程

数学证明的事件化记录:构建可追溯、可验证的AI推理过程

1. 这不是“AI写证明”,而是让数学推理过程真正可追溯、可验证、可复盘的底层重构“事件模型下AI数学证明的事件化记录与透明性架构”——这个标题里没有一个字是虚的,它直指当前AI数学推理系统最痛的软肋:我们能看到结论,却看不见…

2026/10/12 10:02:52 阅读更多 →
轻型AI中台:解决中小企业重复录入与对账困难的工程化方案

轻型AI中台:解决中小企业重复录入与对账困难的工程化方案

1. 项目概述:为什么一个“轻型AI中台”能真正解决财务与运营一线的痛感“部署轻型AI中台,消除重复录入、消减对账困难”——这句话不是PPT里的口号,而是我去年在三家中小制造企业、两家连锁零售服务商现场蹲点三个月后,亲手推出来…

2026/10/12 10:02:52 阅读更多 →
Hive外部表映射HBase已有数据实战指南

Hive外部表映射HBase已有数据实战指南

1. 项目概述:为什么非得用 Hive 外部表去“看” HBase 已有数据? 在某次数据平台升级中,我接手了一个典型的老系统迁移任务:上游业务系统多年积累的用户行为日志,早已稳定写入 HBase 集群,表名 user_acti…

2026/10/12 10:02:52 阅读更多 →
three.js编辑器开发实战:从渲染循环到撤销重做的完整指南

three.js编辑器开发实战:从渲染循环到撤销重做的完整指南

1. 为什么我不建议你从零手写渲染循环很多人第一次接触 three.js 编辑器开发,脑子里蹦出来的第一个念头是"我要自己写一套渲染管线"。这个想法本身没错,但如果你真的从requestAnimationFrame开始一行行搭,大概率会在第三天卡在&quo…

2026/10/12 10:01:51 阅读更多 →

日新闻

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

在数码相机、高清显示屏与现代矢量图形技术高度发达的今天,画面可以做到绝对的锐利、平滑与无瑕。然而,当一张秋日手账插画或拍立得照片过于“平整无瑕”时,往往会散发出一种冰冷生硬的“数码塑料感(Digital Plasticity&#xff0…

2026/10/12 0:00:59 阅读更多 →
活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

在现代网页与移动端设计中,横排(Horizontal Layout)早已经成为了绝对的主流。然而,当我们翻开泛黄的线装古籍、宋版木刻诗集,或是欣赏一张茶道雅集的手写便签时,那种**自上而下纵向书写、自右向左逐列铺展&…

2026/10/12 0:00:59 阅读更多 →
周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

每到周日的晚上八点到十点,很多人心里都会悄悄亮起一盏警示灯。 在心理学上,这种现象有一个专门的称谓——“周日夜晚焦虑症(Sunday Scaries)”。明天又是周一,闹钟又要重新在七点响彻卧房;脑海里仿佛有一个…

2026/10/12 0:00:59 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/12 0:16:30 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/12 0:16:43 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 10:45:37 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:53 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:54 阅读更多 →