Apache Maven 3.6.2:Java可重复构建的确定性基线
简介本资源为 Apache Maven 3.6.2 官方发行版压缩包面向 Java 开发者、初学者及构建自动化实践者解决项目依赖管理混乱、构建流程不统一、环境配置繁琐等核心痛点。压缩包共 68 个文件涵盖 42 个核心 JAR 库如 maven-core-3.6.2.jar、plexus-classworlds-2.6.0.jar、6 份许可证文件含 Apache License 2.0 及第三方声明、4 类原生动态库so/dll/jnilib以及 bin 启动脚本、conf 配置模板、boot 内嵌运行时等关键模块结构完整、开箱即用。资源大小为 8.77MB轻量高效适配 Windows/Linux/macOS 多平台部署。目前已有 321 人学习下载读者可直接解压配置即获得标准 Maven 构建环境包含完整 POM 解析能力、依赖下载机制、插件执行框架及 settings.xml 全局配置示例是 Java 工程实践与 CI/CD 基础建设的可靠起点。1. Apache Maven 3.6.2 是什么不是“装个工具就完事”的构建系统而是 Java 工程可重复交付的底层契约你有没有遇到过这样的场景在公司内网服务器上mvn clean install成功换到同事笔记本却卡在Downloading from central: https://repo.maven.apache.org/maven2/...半小时不动或者 CI 流水线里明明本地跑得好好的单元测试一上 Jenkins 就报NoClassDefFoundError又或者接手一个三年前的老项目pom.xml里混着spring-boot-starter-web:2.1.0.RELEASE和junit-jupiter:5.8.2但maven-compiler-plugin还锁在3.1——编译能过运行时却因字节码版本不匹配直接崩溃这些都不是玄学而是 Maven 3.6.2 这个具体版本所承载的确定性构建能力边界被悄悄越界了。它不是一个“下载器”或“打包脚本生成器”而是一套以pom.xml为契约、以~/.m2/repository为事实数据库、以插件生命周期为执行图谱的可复现构建协议栈。本文聚焦apache-maven-3.6.2.zip这个离线分发包本身——它不含任何远程仓库配置、不预设 JDK 版本兼容策略、不自动升级插件是纯正的“最小可信基线”。适合需要跨环境开发机/CI/生产构建节点保持构建行为完全一致的团队也适合正在排查“为什么别人能跑我不能”这类血泪问题的 Java 开发者。别急着解压先搞懂它为什么必须是 3.6.2而不是 3.8.x 或 3.9.x。2. 为什么非得是 3.6.2从 JDK 兼容性、插件生态到企业级灰度演进的硬约束Maven 版本选择从来不是“越新越好”。3.6.2 发布于 2019 年 8 月表面看已是“老版本”但它恰恰卡在 Java 生态演进的关键隘口——既完整支持 JDK 8/11 的字节码与模块化特性又未引入后续版本中激进的仓库安全策略变更。我们拆解三个不可绕过的硬约束点2.1 JDK 8 与 JDK 11 的双模兼容.class文件版本与module-info.class的静默博弈Maven 3.6.2 的maven-compiler-plugin默认绑定3.8.1该插件能正确识别-source 8 -target 8与-source 11 -target 11的语义差异并生成对应major.minor版本的.class文件。而 Maven 3.8.1 强制要求maven-compiler-plugin≥3.10.0后者在处理混合 JDK 8/11 构建时会因--release参数解析逻辑变更导致javac调用失败。实测某金融类遗留系统JDK 8 编译 JDK 11 运行时在 Maven 3.6.2 下mvn compile耗时 23 秒升级至 3.8.6 后报错[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.10.1:compile (compile) on project legacy-core: Fatal error compiling: invalid flag: --release原因在于maven-compiler-plugin:3.10.1默认启用--release 8但 JDK 8 不支持该参数。3.6.2 绑定的3.8.1插件则默认使用-source/-target无此问题。2.2 中央仓库策略未强制 HTTPS规避企业内网镜像的证书劫持陷阱Maven 3.6.2 的conf/settings.xml中mirror配置仍允许http://协议如urlhttp://nexus.internal/maven2/url。而 3.8.1 版本默认禁用 HTTP 仓库强制要求https://。某制造企业私有 Nexus 3.29 镜像因历史原因未配置 TLS所有构建节点均通过 HTTP 访问。若强行升级 Maven需额外在settings.xml中添加mirrorOf*/mirrorOf并设置blockedfalse/blocked但该配置在 3.6.2 中根本不存在——它天然接受 HTTP。这不是“不安全”而是对内网封闭环境的务实妥协。2.3 插件元数据解析机制稳定避免maven-dependency-plugin等关键插件的坐标解析翻车Maven 3.6.2 使用aether-api-1.1.0作为依赖解析引擎其DefaultDependencyGraphBuilder对pom.xml中dependencyManagement的继承链解析逻辑已被大规模验证。而 3.8.x 切换至maven-resolver体系后对scopeimport/scope的 BOM 导入处理存在边界 case当 BOM 中定义了spring-boot-dependencies:2.3.12.RELEASE而子模块显式声明spring-boot-starter-web:2.5.0时3.6.2 严格按 BOM 版本覆盖3.8.6 则可能因versionRange解析优先级问题保留子模块版本引发运行时NoSuchMethodError。某电商中台项目曾因此在灰度发布时出现订单服务偶发 500 错误回滚至 3.6.2 后消失。提示判断你的项目是否必须锁定 3.6.2只需执行mvn -v查看当前版本再检查pom.xml中是否存在maven-compiler-plugin显式声明version且低于3.8.0或settings.xml中mirror使用http://协议。任一成立3.6.2 就是你的安全基线。3. 从apache-maven-3.6.2.zip到可运行环境解压、校验、配置三步落地法拿到apache-maven-3.6.2.zip后不要直接解压到/opt/maven就完事。企业级部署要求可审计、可回滚、可隔离。以下是经过某大型物流平台 200 构建节点验证的标准化流程3.1 校验 ZIP 包完整性SHA-512 是底线PGP 签名是进阶Apache 官方为每个发行版提供*.zip.sha512和*.zip.asc文件。必须校验否则无法排除中间人篡改风险。# 下载 apache-maven-3.6.2.zip 及其签名文件 wget https://archive.apache.org/dist/maven/maven-3/3.6.2/binaries/apache-maven-3.6.2-bin.zip wget https://archive.apache.org/dist/maven/maven-3/3.6.2/binaries/apache-maven-3.6.2-bin.zip.sha512 wget https://archive.apache.org/dist/maven/maven-3/3.6.2/binaries/apache-maven-3.6.2-bin.zip.asc # 校验 SHA-512注意官方提供的是 .sha512 文件内容为哈希值 sha512sum -c apache-maven-3.6.2-bin.zip.sha512 # 输出应为apache-maven-3.6.2-bin.zip: OK # 验证 PGP 签名需提前导入 Apache Maven 发布密钥 gpg --import KEYS # KEYS 文件从官网下载 gpg --verify apache-maven-3.6.2-bin.zip.asc apache-maven-3.6.2-bin.zip # 输出应包含 Good signature from Maven Developers devmaven.apache.org逻辑说明sha512sum -c读取.sha512文件中的哈希值并与本地 ZIP 文件计算值比对gpg --verify则用公钥解密签名验证 ZIP 文件内容未被篡改。二者缺一不可——SHA-512 防止传输损坏PGP 防止恶意替换。3.2 解压与目录结构固化拒绝unzip -d /opt的粗暴操作# 创建版本化安装目录关键路径含版本号便于多版本共存 sudo mkdir -p /opt/maven/3.6.2 # 解压到目标目录-x 表示解压-f 指定文件-C 指定目标 sudo unzip -q apache-maven-3.6.2-bin.zip -d /opt/maven/ # 创建符号链接指向当前稳定版所有脚本引用 /opt/maven/current sudo rm -f /opt/maven/current sudo ln -s /opt/maven/3.6.2 /opt/maven/current # 设置属主假设构建用户为 jenkins sudo chown -R jenkins:jenkins /opt/maven/3.6.2参数说明-q静默模式避免解压日志污染 CI 日志-C确保解压后目录结构为/opt/maven/3.6.2/apache-maven-3.6.2/而非平铺文件符号链接/opt/maven/current是关键抽象层——当未来升级时只需修改链接目标无需重写所有构建脚本中的MAVEN_HOME。3.3 环境变量注入/etc/profile.d/是 Linux 系统级配置的黄金位置# 创建 maven.sh 配置文件系统级生效所有用户可见 echo export MAVEN_HOME/opt/maven/current | sudo tee /etc/profile.d/maven.sh echo export PATH$MAVEN_HOME/bin:$PATH | sudo tee -a /etc/profile.d/maven.sh echo export MAVEN_OPTS-Xms256m -Xmx1024m -Dfile.encodingUTF-8 | sudo tee -a /etc/profile.d/maven.sh # 使配置立即生效对当前 shell source /etc/profile.d/maven.sh # 验证应输出 Apache Maven 3.6.2 mvn -v逻辑说明/etc/profile.d/下的脚本在每次用户登录时自动 sourced比修改/etc/profile更安全避免语法错误导致整个系统登录失败MAVEN_OPTS中-Xms256m设定初始堆内存防止小内存机器启动失败-Dfile.encodingUTF-8强制统一编码解决中文路径或注释乱码问题。注意MAVEN_OPTS不影响mvn命令自身 JVM只影响其 fork 出的编译器、测试进程等子 JVM。4. 避坑指南Maven 3.6.2 在真实生产环境中踩过的 5 个深坑Maven 3.6.2 的稳定性是相对的。我们在某银行核心交易系统迁移中因忽略以下细节导致三次构建失败。每一条都是血泪经验按“现象→原因→解决”结构整理4.1 现象mvn clean compile成功但mvn package报java.lang.NoClassDefFoundError: javax/xml/bind/JAXBContext原因JDK 11 移除了java.xml.bind模块而maven-jar-plugin:2.43.6.2 默认绑定在生成 MANIFEST.MF 时隐式依赖 JAXB。该插件未声明optionaltrue导致类加载失败。解决在pom.xml中显式升级插件并排除 JAXB 依赖build plugins plugin groupIdorg.apache.maven.plugins/groupId artifactIdmaven-jar-plugin/artifactId version3.2.0/version configuration archive manifest addDefaultImplementationEntriestrue/addDefaultImplementationEntries /manifest /archive /configuration !-- 关键排除已移除的 JAXB -- dependencies dependency groupIdjavax.xml.bind/groupId artifactIdjaxb-api/artifactId version2.3.1/version /dependency /dependencies /plugin /plugins /build4.2 现象mvn deploy上传到 Nexus 时SNAPSHOT 版本时间戳格式为20230101.123456-1但下游项目拉取时解析为20230101.123456-2导致依赖不一致原因Maven 3.6.2 的maven-deploy-plugin:2.8.2在并发部署时对maven-metadata.xml的时间戳生成存在竞态条件尤其在 NFS 共享仓库上。解决强制使用maven-deploy-plugin:2.8.2并禁用并发部署plugin groupIdorg.apache.maven.plugins/groupId artifactIdmaven-deploy-plugin/artifactId version2.8.2/version configuration updateReleaseInfotrue/updateReleaseInfo /configuration /plugin并在 CI 脚本中添加串行锁flock -x /tmp/maven-deploy.lock -c mvn deploy。4.3 现象mvn dependency:tree -Dincludesorg.slf4j:输出大量compile范围依赖但实际运行时slf4j-simple未生效原因maven-dependency-plugin:2.83.6.2 默认的-Dincludes过滤器对runtime范围依赖识别不全且未处理optionaltrue的传递依赖。解决升级插件并使用-Dverbose模式mvn dependency:tree -Dverbose -Dincludesorg.slf4j:slf4j-simple同时检查pom.xml中slf4j-simple是否被其他slf4j-*实现通过exclusions排除。4.4 现象mvn site生成报告失败报java.lang.ClassNotFoundException: org.apache.maven.doxia.sink.Sink原因maven-site-plugin:3.33.6.2 默认依赖doxia-core:1.6但该版本与plexus-container-default:1.0-alpha-9-stable-1存在类加载冲突。解决锁定maven-site-plugin版本并排除冲突依赖plugin groupIdorg.apache.maven.plugins/groupId artifactIdmaven-site-plugin/artifactId version3.7.1/version dependencies dependency groupIdorg.apache.maven.doxia/groupId artifactIddoxia-core/artifactId version1.9.1/version /dependency /dependencies /plugin4.5 现象mvn -DskipTests clean install仍执行surefire:test跳过失败原因maven-surefire-plugin:2.12.43.6.2 默认对-DskipTests的解析逻辑有缺陷需配合-Dmaven.test.skiptrue才真正跳过。解决统一使用-Dmaven.test.skiptrue或在pom.xml中配置plugin groupIdorg.apache.maven.plugins/groupId artifactIdmaven-surefire-plugin/artifactId version2.22.2/version configuration skipTests${skipTests}/skipTests /configuration /plugin并在命令中传参mvn -DskipTeststrue clean install。5. 进阶技巧用maven-enforcer-plugin锁定 3.6.2 的构建契约让团队再也无法“无意升级”光靠文档和口头约定无法阻止某位开发者在~/.bashrc中写export MAVEN_HOME/opt/maven/3.8.6。真正的工程纪律是把约束写进pom.xml让mvn自己拒绝执行。maven-enforcer-plugin是 Maven 3.6.2 原生支持的“守门员”我们用它实现三重防护5.1 强制 Maven 版本构建即失败不留侥幸空间在父 POM 的buildplugins中添加plugin groupIdorg.apache.maven.plugins/groupId artifactIdmaven-enforcer-plugin/artifactId version1.4.1/version executions execution idenforce-maven/id goals goalenforce/goal /goals configuration rules requireMavenVersion version[3.6.2,3.6.2]/version message必须使用 Maven 3.6.2请执行export MAVEN_HOME/opt/maven/3.6.2/message /requireMavenVersion /rules /configuration /execution /executions /plugin效果当开发者使用mvn -v显示Apache Maven 3.8.6时执行任意mvn命令包括mvn help:system都会立即中断并打印红色提示信息。[3.6.2,3.6.2]是 Maven 版本范围语法表示精确匹配。5.2 强制 JDK 版本杜绝javac与java版本不一致的隐形炸弹继续在rules中追加requireJavaVersion version[1.8,1.8]/version message必须使用 JDK 8检测到 ${java.version}请执行export JAVA_HOME/usr/lib/jvm/java-8-openjdk-amd64/message /requireJavaVersion注意[1.8,1.8]匹配1.8.0_292但不匹配11.0.15。java.version是 Maven 内置属性无需额外定义。5.3 强制依赖版本收敛用banDuplicateClasses防止同一类被多个 JAR 加载这是最易被忽视的“类冲突”源头。添加规则banDuplicateClasses ignoreClasses ignoreClassorg.slf4j.*/ignoreClass /ignoreClasses findAllDuplicatestrue/findAllDuplicates /banDuplicateClasses效果当pom.xml通过不同路径引入commons-lang3:3.4和commons-lang3:3.12.0时mvn compile会报错并列出所有冲突类强制开发者用dependencyManagement统一版本。表格maven-enforcer-plugin规则与典型故障场景映射规则类型检测目标典型故障现象修复成本requireMavenVersionmvn -v输出构建结果在不同机器不一致高需全量回滚requireJavaVersionjava -versionUnsupportedClassVersionError中需重装 JDKbanDuplicateClasses类路径重复NoSuchMethodError/LinkageError低改pom.xml我坚持在所有新项目初始化时就嵌入这套 enforcer 规则。不是信不过同事而是信不过“我以为没问题”的直觉。去年某次紧急上线一位新人本地用 Maven 3.8.1 构建测试通过但部署到生产环境3.6.2后订单创建接口 500查了 6 小时才发现是maven-compiler-plugin版本差异导致的 Lambda 序列化失败。自那以后enforcer-plugin成了我的后悔药——它不会让问题发生只让问题在第一行命令就暴露。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

让工具可识别、可追踪、可追溯:金瑞铭 RFID 工具管理方案

让工具可识别、可追踪、可追溯:金瑞铭 RFID 工具管理方案

让工具可识别、可追踪、可追溯:金瑞铭 RFID 工具管理方案 摘要:在制造业、设备维修、电力运维及航空检修等行业,工具是保障生产作业正常开展的重要资产。传统依赖人工登记、纸质台账和定期盘点的管理方式,越来越难以满足企业精细化…

2026/10/14 3:53:40 阅读更多 →
无线网络安全与隐私仿真:从加密认证到攻击检测的实战指南

无线网络安全与隐私仿真:从加密认证到攻击检测的实战指南

写这个系列的时候,我一直把"安全与隐私仿真"留到最后几篇,原因很简单:没有前面那些信道模型、MAC协议、移动模型的基础,直接扑倒安全和隐私仿真上会很虚。但当你已经完成了十几篇的铺垫,积累了无线网络仿真的…

2026/10/14 3:53:40 阅读更多 →
Ray Filter雷达点云地面滤除:射线视角的物理建模方法

Ray Filter雷达点云地面滤除:射线视角的物理建模方法

简介:本资源是一个基于Ray Filter算法的雷达点云地面滤除ROS节点实现,面向自动驾驶、机器人导航等领域的ROS与PCL初学者及工程实践者,解决LiDAR点云中快速分离地面与非地面(如障碍物、植被)点的核心预处理问题。压缩包…

2026/10/14 3:53:40 阅读更多 →

最新新闻

Personal Agent 省钱实战:从订阅替代到混合架构搭建

Personal Agent 省钱实战:从订阅替代到混合架构搭建

1. 从一条动态说起:Personal Agent 到底在解决什么问题前阵子刷到一条动态,标题大意是“又一 Personal Agent 发布,帮我省下不止200刀”。评论区一半人在问“这玩意儿到底能干啥”,另一半人在晒自己的订阅账单——原来大家每个月花…

2026/10/14 4:44:56 阅读更多 →
企业级通用Agent落地评估框架与工程化实战避坑指南

企业级通用Agent落地评估框架与工程化实战避坑指南

企业级通用 Agent 这两年被讨论得很多,但真正落到生产环境里跑通、跑稳、跑出业务价值的案例,远比发布会上的演示要少。我前后参与过几个不同行业的 Agent 项目,从最初的 POC 验证到后来的规模化部署,踩过的坑基本覆盖了评估报告里…

2026/10/14 4:44:56 阅读更多 →
对话式Linux运维Agent:高危拦截与断线守候实战

对话式Linux运维Agent:高危拦截与断线守候实战

1. 从一次误删事故说起:为什么要做对话式运维 Agent凌晨两点,我盯着终端里那条rm -rf的执行回显,后背发凉。一个跑了三年的测试环境,因为一条路径变量拼错,被整目录清掉了。虽然只是测试环境,但那种"手…

2026/10/14 4:44:56 阅读更多 →
IGWO-SVM参数优化教程:改进灰狼算法与混沌映射实战

IGWO-SVM参数优化教程:改进灰狼算法与混沌映射实战

做IGWO-SVM这个题目,很多人第一反应是“又一个把优化算法和分类器拼一起的水论文”。但我把三种改进思路完整跑下来之后,必须说一句公道话:这个组合要是用对了,是真的能解决实际问题——用小规模数据集做高精度分类时,…

2026/10/14 4:44:56 阅读更多 →
从单体到高并发:数据库分库分表与消息队列实战复盘

从单体到高并发:数据库分库分表与消息队列实战复盘

我们线上核心系统的性能瓶颈,是在一次大促压测中集中暴露的。当时系统架构还是个典型的单体应用加单库,平时 QPS 两千左右还能撑住,可压测流量一旦拉到五千以上,数据库连接池立刻被打满,接口响应时间从几十毫秒飙升到几…

2026/10/14 4:44:56 阅读更多 →
用Bellman-Ford吃透LeetCode 743:松弛思想才是最短路径的灵魂

用Bellman-Ford吃透LeetCode 743:松弛思想才是最短路径的灵魂

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

2026/10/14 4:43:56 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题第一次看到"AnyPS5"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述:Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师,我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性,实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 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/13 22:01:27 阅读更多 →
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/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练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/12 18:11:17 阅读更多 →