Maven 4 内核重构指南:从架构升级到迁移避坑全解析
Maven 4 最近动静不小alpha 版本一路迭代到 RCJava 圈子里的讨论度明显上来了。这个统辖 Java 项目构建整整 15 年的老牌工具终于要迎来一次真正意义上的内核重构。作为一个从 Maven 2 时代用过来的老 Java 开发我对这件事的看法比较复杂既期待它解决那些积压多年的老大难问题又担心迁移过程会踩坑。这篇文章我会从 Maven 4 重构的底层逻辑讲起把新版到底改了什么、为什么要这么改、以及实际迁移时怎么操作、有哪些坑一次性讲清楚。1. Maven 3 统治了 15 年为什么非要动内核1.1 一个诞生于 2005 年的老架构很多人以为 Maven 3 是 2010 年才有的其实它的架构根基可以追溯到 Maven 2 时代。2005 年前后Java 生态还在 J2EE 和 SSH 框架的混战期Maven 提出了约定优于配置这个当时非常前卫的理念项目结构固定、生命周期固定、依赖声明式管理把 Java 项目从 Ant 脚本的泥潭里拉了出来。这套设计在当年是降维打击但问题也出在太成功上——架构一旦成为行业标准就很难推倒重来。Maven 3 的核心类设计至今还带着明显的 2000 年代风格一个MavenProject对象身兼数职既要管坐标、又要管依赖、还要管构建状态MavenSession被大量静态方法全局引用插件在执行时直接操作内部实现。说白了Maven 3 的架构不是设计出来的,而是长出来的十五年下来没人敢轻易动它。1.2 三大痛点插件难写、并行假象、POM 靠打补丁第一个痛点在插件开发上。写过 Maven 插件的人应该都有体会插件 API 暴露给你的对象全是 Maven 3 内部实现类比如MavenProject、MavenSession、ArtifactRepository。你要想做点稍微深入的功能就不可避免地跟实现细节死死绑在一起。结果就是 Maven 每升级一个小版本插件市场就会哀嚎一片——NoSuchMethodError是插件开发者最熟悉的异常没有之一。第二个痛点是并行构建和增量构建能力。Maven 3 的-T 1C并行参数是后来打补丁加进去的核心生命周期调度仍然是串行思维。模块之间的依赖关系推导不够精确导致很多本该并行的任务被强行排队。至于增量构建基本不存在。我见过太多团队微调一行代码就要clean package一跑就是几分钟全靠硬件硬扛。第三个痛点更深入POM 的表达力严重不足。依赖版本冲突要靠dependencyManagement手工控制CI 环境下的动态版本号得引入flatten-maven-plugin和${revision}占位符多模块之间的大版本管理要靠 release 插件小心翼翼地点下一步。这些全是补丁方案模型本身并不真正理解这些语义。15 年下来Maven 3 的 POM 模型早就被社区的各种 hack 用出了工伤。1.3 为什么选择兼容演进而不是另起炉灶面对这些积弊Maven 团队其实有两条路像 Gradle 那样搞一套完全不同的 Groovy/Kotlin DSL 构建体系或者保留 Maven 的哲学和生态但重写内核。他们选了后者。Maven 4 保留了pom.xml的基本形态保留中央仓库、settings.xml、本地仓库目录结构甚至绝大多数 Maven 3 项目的 POM 都能直接用。但内核的组件组装方式、API 边界、生命周期调度全部重构。这个决策很务实Maven 最大的资产不是代码而是十五年来积累的中央仓库生态和全球开发者的使用习惯。如果把 POM 语法也推倒重来等于把用户直接推向 Gradle。所以你可以把 Maven 4 理解成换了个心脏但没换骨架——对普通项目来说迁移成本被压到很低对插件作者和工具链开发者来说这是一次大考。2. Maven 4 到底重构了什么内核、模型与构建机制2.1 基于 JSR-330 的模块化内核对插件生态的影响Maven 4 最根本的变化在组件架构层。新版把所有核心模块重新梳理了一遍拆成了职责单一的 API 模块maven-api-core面向插件开发者和生命周期管理定义了一套全新的Session、Project、Model接口maven-api-impl是默认实现内部基于 Sisu 容器和 JSR-330javax.inject注解组装组件maven-api-model对应新的 POM 模型层maven-api-cli则是命令入口抽象。JSR-330 的好处在于所有核心组件都通过Named和Inject声明依赖关系不再依赖隐藏的全局单例和静态方法。以前你想在 Maven 里做点个性化行为得跟一堆静态工具类搏斗现在组件边界清晰替换实现、写 profiling、做嵌入式调用都容易得多。对普通用户来说这个变化感受不明显但对插件作者和 IDE 集成方而言这是天翻地覆的。插件开发领域最直观的变化是旧的MavenProject和MavenSession被新的org.apache.maven.api.Project和org.apache.maven.api.Session取代新 API 大量使用不可变对象和接口默认方法。这意味着插件不能再神不知鬼不觉地修改项目模型状态构建过程的副作用大幅减少。从工程角度讲这是一次非常健康的收紧。2.2 POM 模型升级到 4.1.0哪些写法变了模型版本从4.0.0升到4.1.0是 Maven 4 的又一标志性变化。但这里要澄清一点4.1.0并不是对4.0.0的推翻而是向后兼容的扩展。Maven 4 读取旧版 POM 时依然按旧语义解析绝大多数现有项目不会因为 modelVersion 报错。那升级模型的目的是什么主要是增加表达力。几个关键变化第一CI 友好版本号从hack变成了一等公民。Maven 3.5 时代引入的${revision}、${sha1}、${changelist}占位符到了 Maven 4 成为模型层面的原生支持发布时不再需要额外依赖 flatten 插件来展开占位符。这对多模块项目的版本管理是实打实的减负。第二依赖管理和 BOMBill of Materials的处理更严格了。dependencyManagement的导入规则、依赖调解dependency mediation的优先级在 Maven 4 中更早、更明确地暴露冲突而不是像 Maven 3 那样往往在运行时才炸出来。第三POM 的继承和聚合逻辑重构。新版对父子 POM 关系的解析更干净减少了父 POM 里声明的东西子模块莫名其妙继承到这类历史包袱。一些团队被迫使用的flatten-maven-plugin、versions-maven-plugin组合拳在新版里逐渐失去存在的必要。2.3 构建缓存、并行调度与 Timeline对大型项目的实用价值Maven 4 在让构建变快这件事上下了不少功夫几个功能组合起来效果很可观。构建缓存Build Cache是我最关注的功能。它允许你把上一次构建的产物缓存起来当源码、依赖、插件配置都没有变化时直接跳过重复的编译、打包步骤从缓存里复制结果。对本地日常迭代来说改动一个模块后重新构建整个仓库大部分模块可以秒级命中缓存而不是重新编译一遍。启用方式很直接通过配置文件加命令行参数组合即可生效。并行调度方面Maven 4 对多模块依赖图的推导更精确模块间等待时间更少-T 1C等并行参数的效果比 Maven 3 更好。在 20 个模块以上的仓库里这种调度优化带来的收益会被放大得很明显。Timeline 是一个很实用的小功能构建结束后你可以查看各插件任务的时间分布快速定位到底哪个插件拖慢了整个构建。以前这需要装第三方插件才能实现现在构建时间线timeline内建在版本里对性能调优和 CI 排障都有帮助。3. 实操Maven 3 项目向 Maven 4 迁移的完整流程3.1 环境准备JDK 17 是硬门槛别在版本上犯迷糊开始迁移前先确认 JDK 版本。Maven 4 运行时要求 JDK 17 及以上这是硬门槛。注意区分运行 Maven 的 JDK和项目编译目标的 JDK你可以用 JDK 17 跑 Maven 4但项目的maven-compiler-plugin依然通过--release参数把字节码级别设为 Java 8 或 Java 11编译产物不受影响。接着下载 Maven 4 二进制发行版解压到本机任意目录我习惯放~/apache-maven-4.0.0然后配置环境变量。注意新版官方推荐用MAVEN_HOME但M2_HOME仍然被识别二选一即可。settings.xml的位置和结构没有变默认的conf/settings.xml仍是全局配置用户级别的~/.m2/settings.xml优先级不变。装完以后验证一下mvn -version看到输出中Apache Maven 4.0.0-...字样就说明装好了。这里我建议在系统里保留 Maven 3 的可执行文件路径比如mvn3软链接后面排查问题会方便很多。3.2 逐步迁移一个真实项目从 baseline 到产物对比迁移一个已有的 Maven 3 项目我建议按下面的顺序操作而不是直接拿 Maven 4 去跑第一步用 Maven 3 构建一次基线。执行mvn clean verify并记录结果同时导出依赖树留档mvn dependency:tree deps-maven3.txt第二步切换到 Maven 4执行同样的mvn clean verify。如果项目插件版本较老大概率会在插件加载阶段就报错。常见的报错是NoSuchMethodError或AbstractMethodError指向某个插件对旧版maven-plugin-api的依赖。处理方案很机械找到报错插件升级到支持 Maven 4 的版本重新构建。第三步处理 POM 校验警告。Maven 4 对 POM 的校验比 3 严格比如插件版本必须显式声明、dependencyManagement中的非受管依赖会给出提示。这些大多是 warning 级别不会阻断构建但建议处理掉否则升级后 CI 日志会非常吵。第四步检查 CI 脚本。如果你在 CI 里用了-Dmaven.repo.local...、--settings、--toolchains这类参数Maven 4 仍然兼容。但如果用到了maven-antrun-plugin、build-helper-maven-plugin、maven-release-plugin这类操作比较底层的插件务必确认升级到较新版本。第五步对比构建产物。构建成功后对比 target 目录的结构、JAR/WAR 包内容、Manifest 信息是否与 Maven 3 版本一致。这一步容易被忽略但很重要——插件行为的变化可能导致产物细节不同比如maven-jar-plugin新版生成的 manifest 顺序有变化某些场景下会影响运行时行为。3.3 插件兼容性参考我实测过的一套组合迁移过程中插件版本是最容易卡住的环节。下面这份清单是我在一个中型 Spring Cloud 多模块仓库里验证过的组合仅供参考。实际迁移时建议以 Maven 仓库中的最新发布版本为准。插件Maven 3 时代常见版本Maven 4 推荐版本备注maven-compiler-plugin3.8.13.13.0建议统一用--release编译maven-surefire-plugin2.22.23.2.53.2.x 做了大重构API 更干净maven-jar-plugin3.2.03.4.0注意 manifest 配置写法maven-shade-plugin3.2.43.5.0依赖重构时注意过滤规则maven-source-plugin3.2.13.3.0基本无感升级即可maven-javadoc-plugin3.4.03.6.0JDK 17 下需要新版maven-enforcer-plugin3.0.03.4.0规则配置保持不变还有一个容易漏掉的是maven-release-plugin。这个插件在 Maven 4 下对版本号处理逻辑有变化建议团队在测试环境先演练一遍 release 流程再上线切换。4. 实测对比Maven 3 与 Maven 4 构建差异4.1 多模块项目的并行构建实测我在一个 24 个模块的 Spring Cloud 项目上做了对比测试。机器配置是 8 核 16 线程JDK 17构建命令统一为clean verify缓存目录清空。Maven 3.9.6 串行构建耗时 4 分 58 秒加-T 1C后降为 2 分 21 秒。切到 Maven 4 后同样串行构建是 3 分 55 秒加上-T 1C后降到 1 分 58 秒。这个结果符合预期Maven 4 串行更快是因为生命周期调度和模型解析效率提升了并行更快则是因为模块间依赖关系的推导更精确每个模块的插件任务可以更早进入执行队列减少了排队等待时间。在模块数量更多、依赖图更复杂的仓库里这个差距会更明显。4.2 构建缓存的效果到底有多明显缓存功能是我最看重的体验升级。实测场景全量构建一次后仅仅修改了其中一个模块的源代码再次执行clean install。不启用缓存时整个仓库重新编译打包耗时约 4 分钟。启用缓存后未改动模块的编译、打包任务直接命中缓存耗时降到 50 秒左右——其中大部分时间花在改动模块的编译和最终的 install 步骤上。对于本地频繁改代码、改配置的日常开发来说这个体验提升是质的飞跃颇有几分改完代码秒出产物的快感。不过要注意缓存命中的前提是输入完全一致包括依赖版本、插件版本、配置文件。如果团队经常升级依赖、频繁调整 POM缓存命中率会打折。另外如果某个插件的任务本身有副作用比如生成代码、写文件、调外部服务缓存命中会跳过它这可能会导致问题。建议在启用缓存前期多观察构建日志确认哪些任务被缓存跳过了。4.3 日志、报错与 Timeline 的排障体验Maven 4 的日志变化也是感受很直观的一部分。默认彩色输出在 TTY 环境让哪个模块成功、哪个失败一目了然构建失败时的错误块压缩得更紧凑直接给出失败的插件名和 goal 定位而不是像 Maven 3 那样经常把堆栈信息撒得满地都是。Timeline 功能对定位性能瓶颈非常有用。我拿到一个新项目时会先完整构建一次然后查看时间线报告找出耗时最高的插件任务。我这边测试的项目里排在前面的往往是maven-compiler-plugin的compile任务、maven-surefire-plugin的测试执行、以及maven-surefire在 fork 新 JVM 时的启动开销。这些信息以前要靠-X调试日志才能拼凑出来现在直接就能看到。5. 常见问题与避坑指南5.1 插件 API 不兼容NoSuchMethodError 全家桶这是迁移时最普遍的问题。典型的报错长这样java.lang.NoSuchMethodError: void org.apache.maven.plugin.AbstractMojo.setLog(org.apache.maven.plugin.logging.Log)原因是插件编译时依赖的maven-plugin-api版本过低而 Maven 4 运行时的 API 已经变了。排查思路很简单把 stacktrace 顶部的插件坐标找出来去仓库查该插件是否有针对 Maven 4 的版本升级即可。如果插件已经停止维护那就得评估更换插件或者改用其他方案。这里我给个实用建议升级插件时从执行顺序靠前的开始逐个升比如先升 compiler、然后 surefire、最后 jar/shade每次升完跑一次构建避免一次升级太多导致不知道哪个出了问题。5.2 POM 校验变严警告不一定阻断但最好处理Maven 4 对 POM 的 schema 校验更严格。典型情况是以前 Maven 3 只给 warning 的写法在 Maven 4 下仍然给 warning但措辞更明确。比如未显式声明插件版本、modelVersion缺失、dependencyManagement里的依赖没有版本号等。我的处理策略是把警告当错误看待。因为一旦这些警告在 CI 里累计多了真正的问题会被淹没。推荐在迁移时顺手跑一遍mvn help:effective-pom输出展开后的最终 POM看看有没有意外的继承或覆盖再决定怎么清理。5.3 依赖调解规则变化构建期更早暴露冲突Maven 4 对依赖调解的处理更严格个别项目会遇到 Maven 3 下静默通过、Maven 4 下直接构建失败的场景。举个例子项目 A 依赖 BB 传递依赖了 guava 30项目 A 又直接依赖了 CC 传递依赖了 guava 32。在 Maven 3 的最近声明优先规则下最终版本取决于声明顺序可能静默选了一个。Maven 4 下这类冲突会更早暴露或者按依赖收敛dependency convergence规则给出明确警告。遇到这种情况我不建议在 Maven 4 里强行调声明顺序来骗过调解器正确做法是用dependency:tree找出冲突的真实来源在根 POM 的dependencyManagement里显式锁定版本保持全仓库依赖收敛。顺便可以引入 enforcer 的dependency-convergence规则把这类问题在构建期一次性暴露。5.4 团队落地先试用、再铺开、留退路对于正在评估是否切换到 Maven 4 的团队我的建议很明确新项目可以直接用 Maven 4老项目不要急着一步到位。实操策略是开发机先切CI 暂缓。让团队里两三个熟悉构建的人先在本地用 Maven 4 跑日常开发积累插件兼容性数据和问题清单。等常用插件版本都确认没问题了再在 CI 里切一个分支做验证。同时保留 Maven 3 的可执行文件作为回滚手段——在实际操作中准备一条退路比盲目自信重要得多。另外建议把 Maven 4 迁移和 JDK 17 升级放在同一个时间窗口推进。既然运行 Maven 4 必须要 JDK 17那编译目标升级到 17 或 21 也是顺理成章的事两者一起做能省下一轮重复的插件兼容性排查。我个人在实际操作中的体会是Maven 4 的价值不在于那一点构建速度提升而在于它把 Maven 这个十五年的老工具从能用拉回到了好用。如果你被多模块并行构建、依赖冲突、CI 版本号管理这些问题折磨过Maven 4 确实值得一试。最后再补一句实在话升级前把mvn dependency:tree的结果备份一份把 Maven 3 的 bin 留在 PATH 里等你的团队在 Maven 4 上连续跑两周构建都没出问题再彻底切换也不迟。

相关新闻

软考数据库系统工程师:关系代数核心考点与解题全攻略

软考数据库系统工程师:关系代数核心考点与解题全攻略

距离软考数据库系统工程师考试还有一段时间的时候,总有人问我:关系代数到底怎么学?教材翻来翻去就那几页,选择、投影、连接、除运算看起来也不复杂,可一到真题就懵,尤其是那些带“全部”“至少”“没有”字…

2026/10/3 18:13:06 阅读更多 →
多目标优化驱动冷热电联供系统运行:CCHP调度实战解析

多目标优化驱动冷热电联供系统运行:CCHP调度实战解析

“这个电价下,光靠燃气轮机跟吸收式溴化锂配合,很可能比不过‘电制冷燃气锅炉’的常规路子!”——这是我第一次把完整冷热电联供(CCHP)模型跑通、拿到初步帕累托前沿时,对着合伙人说的第一句话。做综合能源…

2026/10/3 18:13:06 阅读更多 →
冷热电联供系统多目标优化实战:NSGA-II建模与调参全记录

冷热电联供系统多目标优化实战:NSGA-II建模与调参全记录

做综合能源系统优化这几年,冷热电联供(CCHP)一直是我觉得最有嚼头的方向。单个设备的热力计算不难,但把燃气轮机、余热锅炉、吸收式制冷机、电制冷机、储能装置捏成一个整体,再让它同时满足冷、热、电三种负荷的需求&a…

2026/10/3 18:13:06 阅读更多 →

最新新闻

Python+SQL全栈实战:高考志愿填报参考系统源码解析

Python+SQL全栈实战:高考志愿填报参考系统源码解析

简介:这是一套面向高考考生、家长及教育信息化开发者的志愿填报参考系统源码,基于Python与Django构建Web服务,可按高校城市、高考排名、高校层次、专业等条件检索匹配的院校与专业信息,帮助使用者快速定位志愿填报方向。资源包共1…

2026/10/3 18:55:45 阅读更多 →
Hadoop伪分布式搭建与电商商品推荐实战

Hadoop伪分布式搭建与电商商品推荐实战

简介:本资源是一套基于Hadoop生态构建的轻量级商品推荐系统实践项目,面向大数据初学者、高校课程设计学生及分布式计算入门开发者,聚焦电商场景下的用户行为分析与个性化推荐落地。项目依托HDFS分布式存储与MapReduce批处理框架,完…

2026/10/3 18:55:45 阅读更多 →
浏览器端跑YOLO:视觉质检的端侧化工程实践

浏览器端跑YOLO:视觉质检的端侧化工程实践

去年年底接了一个视觉质检项目,客户的要求很直接:检测画面不能出车间,最好连服务器都别装。我当时的第一个念头是这活儿得靠边缘盒子,但现场一看,产线工位上连工控机都是临时凑的,更别说部署什么边缘计算设…

2026/10/3 18:55:45 阅读更多 →
微信内置浏览器抓包实战:ADB与Chrome远程调试全攻略

微信内置浏览器抓包实战:ADB与Chrome远程调试全攻略

有一次我需要排查微信内置浏览器里某个H5页面的接口请求,Fiddler代理、装证书、手机连WiFi代理都试了一遍,结果发现微信里打开任意网页全部白屏,而系统浏览器和第三方App却都能正常走代理。当时第一反应是证书没装对,折腾了半小时…

2026/10/3 18:55:45 阅读更多 →
AI应用底座QuickBlue:打通企业大模型落地的最后一公里

AI应用底座QuickBlue:打通企业大模型落地的最后一公里

1. 先搞明白:QuickBlue 是什么?最近帮几家企业做 AI 落地选型,几乎每一家都问同一个问题:大模型选哪个?我通常会反问一句:你打算怎么把大模型接进现有的 CRM、ERP、工单系统里?然后话题就会转移…

2026/10/3 18:55:44 阅读更多 →
RK3588安卓系统预装输入法内置指南:从mk文件到实战踩坑

RK3588安卓系统预装输入法内置指南:从mk文件到实战踩坑

1. 同样是"预装",为什么有的输入法出厂后却"消失"了 做RK3588安卓方案开发的朋友,大概率都遇到过这种情况:给客户演示样机的时候,把设备恢复出厂设置,结果预装的第三方输入法没了,或者…

2026/10/3 18:54:44 阅读更多 →

日新闻

把回忆蒸馏成 AI 的浪漫实验:为什么你需要前任.skill 完整指南

把回忆蒸馏成 AI 的浪漫实验:为什么你需要前任.skill 完整指南

把回忆蒸馏成 AI 的浪漫实验:为什么你需要前任.skill 完整指南 【免费下载链接】ex-skill 前任 skill 项目地址: https://gitcode.com/gh_mirrors/exsk/ex-skill 前任.skill 是一个运行在 Claude Code 上的开源 Skill:导入微信、iMessage、短信、…

2026/10/3 0:00:27 阅读更多 →
45个经典Linux面试题:从命令到网络排障的完整考点解析

45个经典Linux面试题:从命令到网络排障的完整考点解析

刚开始带应届生的时候,我最头疼的就是他们拿着一摞Linux面试题背得滚瓜烂熟,一上机全露馅。后来自己从被面的人变成面别人的人,才慢慢摸清楚:Linux面试题考的根本不是答案本身,而是你面对一个不确定的系统问题时&#…

2026/10/3 0:01:28 阅读更多 →
SAP生产预留实战指南:MB21/MB23/MB25协同与MRP集成

SAP生产预留实战指南:MB21/MB23/MB25协同与MRP集成

简介:本资源是一份面向SAP ABAP开发人员、生产计划专员及ERP实施顾问的实操型操作指南,聚焦SAP生产预留核心业务场景,系统解决物料预留创建、查询、校验与批量处理等高频问题。文档以结构化方式覆盖预留背景原理、OMC2编码规则、工厂级参数配…

2026/10/3 0:01:28 阅读更多 →

周新闻

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解 【免费下载链接】spirula-studio Cross-vendor 3D Gaussian Splatting trainer - video to splat to mesh, Vulkan or CUDA. 项目地址: https://gitcode.com/GitHub_Trending/sp/spirula-studio Sp…

2026/10/3 9:14:33 阅读更多 →
SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南 模板网站太丑不够用?别急着加滤镜,那是治标不治本。很多老板盯着后台流量掉得眼红,却还在纠结首页Banner的圆角是不是3像素。这就像穿着西装去挖土,姿势不对,努力白费。我整理这份 速查手册…

2026/10/3 9:47:50 阅读更多 →
FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏 【免费下载链接】FireRed-OpenStoryline FireRed-OpenStoryline is an AI video editing agent that transforms manual editing into intention-driven directing through natural language …

2026/10/3 9:42:31 阅读更多 →

月新闻

我发现了一个新思路:用 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/2 10:36:31 阅读更多 →
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/3 9:42:35 阅读更多 →
黑夜航拍船只数据集训练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/3 9:42:36 阅读更多 →