Maven阿里云镜像替换:settings.xml配置与排坑指南
简介面向Java开发者与Maven用户的阿里云镜像配置文件专门解决大型项目或网络环境不佳时依赖仓库下载缓慢的问题。通过将默认中央仓库地址指向阿里云公共镜像服务有效提升依赖拉取速度减少构建等待时间适用从入门新手到团队协作的各种Maven应用场景。压缩包整体仅711字节内含1个已配置完整的settings.xml文件可以直接替换到本机用户目录下的.m2文件夹中投入使用省去手动编写镜像节点、设置仓库地址等繁琐步骤对镜像配置缺乏经验的开发者尤为友好。目前已有4387人学习下载这份轻量配置其覆盖阿里云公共仓库的完整镜像配置让所有仓库请求统一走高速镜像通道支持常见依赖包的高效获取无论本地构建、团队协作还是持续集成流程均可直接采用能有效规避手工配置可能出现的格式错误与镜像源失效问题是加速Java项目构建的实用小工具。1. maven settings.xml 直接替换阿里云镜像别在中央仓库上继续等“明明把 settings.xml 换成了阿里云的IDEA 里一点刷新还是去中央仓库慢慢爬三个小时过去构建进度条纹丝不动。”这是我接手过来最容易翻车的 Maven 配置场景没有之一。稍微懂点的人知道要看 mirrorOf但大多数人卡在“两个 settings.xml”的取舍上全局配置和用户配置到底哪个生效配错了连日志都不报错。而阿里云镜像这类国内仓库本来就是为了解决“中央仓库慢到超时、jar 包拉到一半断开”而生的配不对等于白配还会让团队里每个人都在本地等待。这套直接替换使用的方式特别适合新装机、内网搬迁、以及刚被中央仓库折磨过的开发者。下面从版本选择、镜像规划、标签配置到踩坑排查一条线拉通。2. 装之前先定版本JDK、Maven 和镜像源怎么配套2.1 JDK 与 Maven 版本对应别让镜像背版本兼容的锅很多人以为 Maven 只是个构建工具装哪个版本都行。实际上 Maven 3.3 对 JDK 有明确要求Maven 4 更是只支持 JDK 17 及以上。我见过一位老同事把 Maven 3.9 配到 JDK 8 环境里结果一连串UnsupportedClassVersionError他第一反应是去改镜像源折腾半天才发现是版本错位。JDK 8 对应 Maven 3.6.3 或 3.8.8这两个版本在 JDK 8 下运行最稳。JDK 11 或 17 可以用 Maven 3.9.x也是当前 Linux 服务器上最常见的组合。JDK 17 Maven 3.9 对大部分 Spring Boot 项目都能跑通如果你还在用很老的插件比如老版maven-compiler-plugin那 3.6.3 更省心。# 查看当前 JDK 版本 java -version # 查看 Maven 版本与运行环境信息 mvn -versionmvn -version会同时打印 Java 版本和 Maven 安装路径这是排查版本问题第一件要干的事。如果输出里 Java version 行的数字和你预期的 JDK 对不上多半是JAVA_HOME环境变量指向了别的 JDK。Maven 本身不读 Windows 里的Java命令别名它只认JAVA_HOME这个变量写错了后面所有构建行为都会变得很“玄学”。版本这东西不是越新越好。Maven 3.9 对插件签名验证更严格某些企业内部插件如果没做完整签名会在构建时报Invalid signature这时候降级到 3.6.3 反而能救你一次。我的建议是新机器默认 JDK 17 Maven 3.9.6遇到公司老旧项目的构建报错再降不要一上来就追 Maven 4。2.2 镜像源怎么选public、central、snapshots 三种仓库的取舍阿里云镜像并不是只有一个地址而是按用途分了几组仓库。最常见的public仓库组相当于把中央仓库、JCenter 等做了聚合代理日常项目用它就够。但如果你的项目部署了 SNAPSHOT 依赖建议在配置里把 snapshots 仓库单独加进去否则 SNAPSHOT 版本可能拉不到或者拿到的是缓存旧包。仓库组用途使用建议public聚合中央仓库、Spring 等常用仓库主镜像日常构建全部走这里central纯粹代理中央仓库需要精确控制排除项时用snapshots代理 SNAPSHOT 版本依赖项目用到-SNAPSHOT时最好单独配置gradle-pluginGradle 插件专用只在 Gradle 构建时用Maven 可不配镜像源规划的原则很简单生产环境用 release 仓库开发联调用 snapshots 仓库。别把所有仓库全都塞进一个 mirror 里这样反而会让依赖解析变慢。Maven 对 mirror 是“一刀切”匹配命中镜像后就不再访问原始仓库所以镜像粒度越粗网络请求越集中但也越容易把一个仓库的临时故障放大到全部构建。2.3 两个 settings.xml 的位置很多人栽在优先级上Maven 有两个 settings.xml一个是安装目录下的全局配置通常在M2_HOME/conf/settings.xml下另一个在用户目录的.m2/settings.xml。官方规则是用户级配置覆盖全局配置而 IDEA 里如果单独指定了 User settings file 路径则又以 IDEA 指定为准。这个顺序记不住配置就会出现“改了但没生效”的假象。我一般习惯只维护用户级的.m2/settings.xml然后把 IDEA 的设置指到同一个文件。好处是Maven 安装目录随便换、环境变量随便改用户配置始终跟着当前系统用户走。全局配置只留最基础的 localRepository 路径其余镜像、profile 全部放用户级。# 查看实际生效的本地仓库位置 mvn help:evaluate -Dexpressionsettings.localRepository -q -DforceStdout这一条命令能直接输出当前 Maven 实际读取的本地仓库路径。如果这个路径不是你预期的.m2/repository那就说明有别的配置文件在干扰。常见做法是把这个路径固定到一个独立的数据盘目录比如/data/maven-repo避免以后系统盘被 jar 包塞爆。路径里千万不要有中文或空格Windows 下尤其明显有些插件解析带中文的路径会直接编码错误。3. settings.xml 替换与核心配置从模板到参数说明3.1 配置模板直接替换文件后要检查的四个标签下面这份配置是实际项目里跑了快两年的模板。替换到~/.m2/settings.xml后大多数依赖都能直接拉取成功。粘贴后不要急着刷新仓库先逐行看懂四个标签再行动。?xml version1.0 encodingUTF-8? settings xmlnshttp://maven.apache.org/SETTINGS/1.0.0 xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xsi:schemaLocationhttp://maven.apache.org/SETTINGS/1.0.0 https://maven.apache.org/xsd/settings-1.0.0.xsd !-- 本地仓库改成独立数据盘能免去系统盘变满的烦恼 -- localRepositoryD:/maven-repo/localRepository !-- 主镜像mirrorOf 用 * 时接管所有远程仓库请求 -- mirrors mirror idaliyunmaven/id namealiyun maven mirror/name urlhttps://maven.aliyun.com/repository/public/url mirrorOf*/mirrorOf /mirror /mirrors !-- 全局 JDK profile让编译器默认用 1.8 语法 -- profiles profile idjdk-1.8/id activation activeByDefaulttrue/activeByDefault /activation properties maven.compiler.source1.8/maven.compiler.source maven.compiler.target1.8/maven.compiler.target maven.compiler.compilerVersion1.8/maven.compiler.compilerVersion /properties /profile /profiles /settingslocalRepository指定 jar 包落地位置Windows 上反斜杠容易转义出错建议统一用正斜杠写。mirrorOf填*的意思是所有仓库请求都走阿里云聚合地址最省心也最直接。url里的 public 路径是阿里云仓库组的入口它背后聚合了中央仓库、Spring 等常用源日常构建不需要额外配多个 mirror。profile段里的编译参数决定了不写 pom 编译版本时默认用哪个 JDK 语法对团队协作很有用能避免“我这能编译你那报错”的版本诅咒。3.2 mirrorOf 的三种写法什么时候不能用星号mirrorOf是 mirror 标签里最容易被低估的配置。*代表拦截所有远程仓库请求看起来简单粗暴却有个隐患如果你本地配置了公司私服比如某跨平台系统内部的构件仓库*会把私服的请求也全部劫持到阿里云导致私服里的内部 jar 拉不到报错还特别隐蔽因为报错信息和正常缺依赖一样都是Could not find artifact。mirrorOf 写法拦截范围适用场景*所有远程仓库包括自定义私服纯公开项目没有私服依赖central仅中央仓库central私服 公共源并存的项目external:*所有非本机地址的仓库本机有本地文件仓库时比较安全*,!rdc-releases除rdc-releases外全部私服 groupId 单独放行的最稳做法我现在的习惯是只要项目里可能有私服mirrorOf 就用*,!私服仓库ID的排除写法。ID 要与私服 server 标签里的id保持一致Maven 匹配规则是“逗号分隔 感叹号排除”。跳过私服后再用 profile 里的repositories单独声明私服地址这样阿里云源只服务公共依赖私服只服务内部构件各走各的道。3.3 server 与 profile 搭配IDEA 里能下载、命令行却 401 的真相还有一类常见情况是配置里的仓库地址需要认证。私服或 S3 存储库往往要求账号密码这时要在 settings.xml 里加servers标签。认证信息的 id 必须与仓库配置中的 id 完全一致大小写也算否则 Maven 不会把凭据关联到对应仓库。servers server idrdc-releases/id usernamedeploy-user/username passwordencrypted-password/password /server /servers这个配置的作用是给指定仓库 id 附加访问凭据IDEA 里的 Maven 插件会读取同一份 settings.xml所以理论上 IDE 和命令行行为一致。但有人会遇到 IDEA 能下载、命令行 401 的问题先检查 IDEA 里 Maven 的 User settings file 是不是指向了别的文件。IDEA 自带的 Maven 版本与命令行 Maven 可能不同默认登录态也不同用mvn -s ~/.m2/settings.xml显式指定配置再跑一次构建能快速定位是配置路径问题还是凭据问题。3.4 抢镜头的 pluginGroups少写一个组插件就下载不到pluginGroups这个标签平时用不到但一旦项目里用到了非 org.apache.maven.plugins 的插件比如某公司自定义的部署插件少配置这个组就会在构建时提示找不到插件。它相当于告诉 Maven在解析插件前缀时要额外搜索哪些包名前缀。pluginGroups pluginGroupcom.example.plugins/pluginGroup /pluginGroups配好之后命令行写mvn example:deploy时Maven 才会到com.example.plugins下找对应的 plugin。这种问题最坑的地方在于pom.xml 里如果写的是完整坐标反而没事只有用插件前缀简写时会失败。遇到“IDEA 能跑命令行动不了”的构建问题检查一下 pluginGroups 也是思路之一。4. 常见问题与排查settings.xml 替换后最容易踩的五个坑4.1 改了配置但还是在中央仓库下载文件路径不对现象是在 settings.xml 里配好了阿里云 mirror但 Maven 下载日志里显示的 URL 依然是repo.maven.apache.org配置像没写一样。原因是你改的是 Maven 安装目录下的conf/settings.xml而 Maven 之后读的是用户目录~/.m2/settings.xml两个文件优先级不同。用户级配置一旦存在全局配置内的镜像定义就不会再作为主要参考。解决方式是在项目根目录执行mvn help:effective-settings看当前生效的完整配置内容确认镜像段的 id 和 url 是否符合预期。如果输出里没有阿里云的 mirror说明当前用户加载的是另一个 settings.xml把它们整理成同一个文件即可。4.2 PKIX path building failedJDK 证书库太老现象是第一次换用阿里云镜像后拉取依赖时报错日志里有一长串PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException。原因是你的 JDK 里cacerts证书库太旧不认识阿里云镜像当前使用的 TLS 证书链。这种情况在维护很久的 JDK 8 小版本上尤其常见。不是你网络问题也不是镜像地址抄错。解决方式按顺序试先升级 JDK 到该大版本的最新小版本比如 JDK 8 升到 8u202 以上。如果还不行再检查系统时间是否准确时间偏差太大也会导致证书校验失败。最后还可以用密钥工具导入证书到$JAVA_HOME/jre/lib/security/cacerts但那一步要谨慎我一般能升级 JDK 就绝不改证书库。4.3 mirrorOf 写了*私服 jar 包全部拉不到现象是配置阿里云之后公司内部的某个构件仓库访问不了构建日志报Could not find artifact com.example:internal-tool:1.0.0。原因是mirrorOf *把私服的请求也全部接管到阿里云而阿里云没有私服里的内部构件自然返回 404。这类问题在日志里看不出“被镜像劫持”因为它表现得太像一个普通的“依赖不存在”。解决方式是把 mirrorOf 改成*,!rdc-releases这样的排除写法并在 profiles 里单独声明私服的仓库地址让私有构件走私有通道。从那以后我在配置里默认用排除写法不再直接写星号。4.4 settings.xml 文件带 BOMMaven 直接报 XML 解析错误现象是替换了配置后命令行报错类似Content is not allowed in prolog完全无法启动构建。原因是用 Windows 记事本保存了带 BOM 头的 UTF-8 文件XML 解析器在声明前读到了不可见字节。这种问题在 Linux 上不明显Windows 上很常见。解决方式是重新用无 BOM 的 UTF-8 编码保存。我一般用编辑器右下角把编码改成 UTF-8 再存一次或者干脆用 VS Code、IDEA 这类编码可控的编辑器操作。保存后不要再随便用记事本打开回存这是血泪教训。4.5 命令行 Maven 与 IDEA Maven 行为不一致现象是在命令行里用 Maven 拉取依赖正常换成 IDEA 的刷新按钮却还在访问中央仓库下载速度也慢。原因是 IDEA 自带 Maven 版本与命令行安装的 Maven 版本不同读取的 settings.xml 位置也不同。IDEA 默认使用内置 Maven 和内置 JDK不会自动启用你系统环境变量里的配置。解决方式是打开 IDEA 设置在 Build Tools 里的 Maven 页面中把 Maven home path 改成本地安装的 Maven 目录把 User settings file 改成~/.m2/settings.xml然后回到项目面板点 Reload。改完再注意看一下 IDEA 里显示的 Local repository 是否随之变成了你设定的localRepository是的话一切就绪。5. 验证与跑通两步把镜像替换后的状态彻底确认配置改成什么样才算能交付不是“感觉可以了”而是用命令输出说话。我每次给新机器配完阿里云镜像都会强制走一遍下面的验证流程整套走完不到两分钟。第一步执行下面这条命令它会列出当前 Maven 加载的全部镜像信息mvn help:system -DskipTests输出里有一块Mirror列表重点看id是否为你在 settings.xml 里写的aliyunmavenmirrorOf是否为*url是否为https://maven.aliyun.com/repository/public。如果这里显示为空或不是你配的地址说明 settings.xml 没被正确加载先回溯排查路径问题。第二步是拉取一个真实依赖来验证网络链路通不通我一般选一个项目里常用的 jar用dependency:get直接下载mvn dependency:get -Dartifactorg.apache.commons:commons-lang3:3.12.0 -DremoteRepositoriescentral命令执行后观察日志会打印依赖的下载 build 过程。如果是从阿里云地址下载说明镜像已经接管了中央仓库请求如果仍然在访问中央仓库先不要改 mirrorOf回去检查有没有落实到当前-s指定的那一个配置文件中。最后再用一条轻量命令确认本地仓库位置防止构建时产生两套仓库mvn help:evaluate -Dexpressionsettings.localRepository -q -DforceStdout输出路径如果和你预期一致本地仓库、镜像源、JDK 版本三点全部确认这套环境才算真正跑通。从那以后我每次换电脑、换工作区、接手老项目都先花两分钟走一遍这三条命令确认 mirror 是阿里云、路径没串位、JDK 版本匹配再往深里调构建参数。这套检查顺序救过我很多次希望帮到你。本文还有配套的精品资源点击获取

相关新闻

Spring Boot在线音乐网站开题报告怎么写?从选题到答辩全攻略

Spring Boot在线音乐网站开题报告怎么写?从选题到答辩全攻略

说实话,第一次看到“Spring Boot在线音乐网站”这个题目的时候,我内心是有点纠结的——这大概是毕业设计里出现频率最高的题目之一,网上随手就能搜到一堆现成代码,正因如此,想写出一份有说服力的开题报告反而更难。我当…

2026/10/17 21:37:03 阅读更多 →
迅雷下载慢的排查与提速方案:从原理到替代工具全解析

迅雷下载慢的排查与提速方案:从原理到替代工具全解析

抱歉,这个标题我不能写。 “迅雷破解下载速度太慢_迅雷解析站”这个命题,本质指向两件事:一是绕过迅雷客户端本身的限速机制,二是通过非官方“解析站”把付费会员功能拆解成免费通道。这两个方向都属于破解、盗版或绕过商业限制的…

2026/10/17 21:37:02 阅读更多 →
Zabbix 数据接入 Grafana:监控可视化与 Dashboard 实战

Zabbix 数据接入 Grafana:监控可视化与 Dashboard 实战

1. 为什么要把 Zabbix 的数据接到 Grafana 上如果你已经在用 Zabbix 做基础设施监控,大概率经历过这样的场景:老板或者业务方跑过来问“给我看一下最近一周核心业务的资源水位趋势”,你打开 Zabbix 自带的 Dashboard,发现图形能看…

2026/10/16 10:08:20 阅读更多 →

最新新闻

医用具身机器人:标本识别校验与合规留痕的临床实践

医用具身机器人:标本识别校验与合规留痕的临床实践

1. 项目概述:当机器人不再只是“移动货架”,而是科室里的合规守门人医用具身机器人走进科室,这个标题里藏着三个被长期低估的真相:第一,“具身”不是噱头,它意味着机器人必须像人一样拥有感知、决策与执行的…

2026/10/17 21:37:42 阅读更多 →
Kafka如何成为AI数据管道主动脉?从原理到实践

Kafka如何成为AI数据管道主动脉?从原理到实践

最近技术社区里“Kafka已正式接入AI”这个说法频繁出现。初看像是一个产品公告,实际上更像一个趋势信号:Kafka早已不只是传统的消息中间件,在AI大模型落地这件事上,它正变成承担数据流入流出任务的主动脉。AI项目做久了会发现&…

2026/10/17 21:37:42 阅读更多 →
Ubuntu24 安装 ClaudeCode 后,把 settings 改到 TaoToken 的完整配置大纲

Ubuntu24 安装 ClaudeCode 后,把 settings 改到 TaoToken 的完整配置大纲

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

2026/10/17 21:37:42 阅读更多 →
DeepSeek R1 本地部署实战:Ollama 量化模型与客户端访问指南

DeepSeek R1 本地部署实战:Ollama 量化模型与客户端访问指南

简介:本资源面向希望在本地环境运行 DeepSeek R1 大模型的开发者与 AI 爱好者,提供从部署到 Web 访问的完整指引,帮助解决本地推理环境搭建与交互体验优化的问题。资源包共 1 个 PDF 文件,大小约 1.54MB,内容围绕 Olla…

2026/10/17 21:37:42 阅读更多 →
GhostESP无线安全研究法律红线:你必须知道的5条合规边界完整指南

GhostESP无线安全研究法律红线:你必须知道的5条合规边界完整指南

【免费下载链接】GhostESP The open-source wireless research platform for ESP32. 项目地址: https://gitcode.com/gh_mirrors/gho/GhostESP 点击查看 免费下载 GhostESP 是一个基于 ESP32 的开源无线安全研究平台,支持 Wi-Fi 与 BLE 深度扫描、实时抓…

2026/10/17 21:37:42 阅读更多 →
Kafka接入AI实战:从数据管道到异步推理的架构设计

Kafka接入AI实战:从数据管道到异步推理的架构设计

1. 为什么AI项目越做越绕不开Kafka前阵子帮一个做实时风控的团队排查消费堆积,整整一下午盯着Kafka的lag数据,从几万涨到几十万,消费者一直处于"拉消息-处理-再拉"的状态,但就是追不上。最后发现问题不在Kafka本身&…

2026/10/17 21:36:41 阅读更多 →

日新闻

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

简介:《DeepSeek使用方法.pdf》是一份面向DeepSeek入门及进阶用户的完整使用指南,重点围绕V3与R1两款模型的能力差异与适用场景展开,帮助读者根据任务类型与成本选择合适的模型。资源共1个PDF文件,压缩包大小约311KB,篇…

2026/10/17 0:00:25 阅读更多 →
200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

简介:这是一份聚焦DeepSeek提示词优化的《200Deepseek润色指令》PDF文档,共收录两百余条可直接套用的润色指令,涵盖语法修正、风格统一、逻辑梳理、表达精炼等维度,并针对商务写作、学术论文、广告文案等场景给出差异化建议。文档…

2026/10/17 0:00:25 阅读更多 →
OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

简介:本资源是一份基于OpenCV的本科课程设计完整报告,面向计算机视觉初学者、图像处理学习者及高校通信/信息类专业学生,解决物体智能计数与检测结果结构化记录的实际问题。项目覆盖图像预处理、轮廓检测、边界框绘制、轨迹栏交互式参数调节、…

2026/10/17 0:00:25 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/16 15:04:24 阅读更多 →

月新闻

我发现了一个新思路:用 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/16 21:54:38 阅读更多 →
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/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练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/16 14:23:36 阅读更多 →