Tomcat 8 启动失败排查指南:JDK兼容、配置陷阱与日志诊断
简介本资源为 Apache Tomcat 8 官方二进制发行版v8.0.32的完整本地镜像包面向 Java Web 开发初学者、后端工程师及教学实践者用于快速搭建本地 Servlet/JSP 运行环境解决开发调试中依赖官方下载慢、网络不稳定或版本校验繁琐等问题。压缩包共278个文件含27个核心jar库支撑容器运行、9个sh/bat启动脚本适配Linux/Windows、5个关键xml配置文件如server.xml、web.xml、14个日志文件含多日期滚动日志示例及大量class、properties等运行时必需文件结构完整覆盖bin/conf/lib/webapps标准目录体系解压即用。资源大小11.57MB轻量高效。已有784人学习下载读者可直接获取开箱可用的Tomcat 8运行体附带真实日志痕迹与典型配置样例便于理解默认行为、调试部署流程及掌握SSL、Manager应用等进阶配置入口。1. Tomcat 8 下载不是点开官网就完事选错版本、配错 JDK、路径带空格三步就能让你卡在启动黑屏你是不是也经历过——下载完apache-tomcat-8.5.99.zip解压双击startup.bat控制台一闪而过浏览器打不开http://localhost:8080连首页都看不到日志里只有一行SEVERE: Failed to initialize connector [Connector[HTTP/1.1-8080]]查半天发现根本没报错堆栈。这不是玄学是 Tomcat 8 的经典三连翻车现场JDK 版本不兼容比如用 JDK 17 跑 Tomcat 8.5、Windows 路径含中文或空格、conf/server.xml 里 Connector 的 protocol 属性写成org.apache.coyote.http11.Http11Nio2Protocol却没启用 NIO2 支持。Tomcat 8 不是“装了就能跑”的傻瓜工具它是 Java Web 容器里最讲规矩的老派工程师——你漏掉一个环境前提它就沉默拒绝不给你任何提示。本文专为正在部署遗留系统、维护老项目、或被要求强制使用 Tomcat 8 的开发者而写。如果你正卡在“下载了但起不来”“能启动但访问 404”“日志空白但服务没响应”这篇就是你的后悔药。我们不讲原理只讲怎么从官网拿到真正能用的包、怎么验证 JDK 是否匹配、怎么改配置绕过默认陷阱、怎么一眼定位真实失败原因。2. 下载与校验认准官方归档页避开镜像站“自动升级”陷阱Tomcat 8 的生命周期早已结束2018 年 11 月 EOLApache 官网不再在首页主推所有新下载链接默认跳转到 Tomcat 9/10。直接搜“tomcat8 下载”点进来的所谓“高速下载站”90% 会偷偷替换成 Tomcat 9 或提供篡改过的二进制包比如删掉bin/catalina.sh的执行权限、替换lib/tomcat-juli.jar。真正的安装起点必须回到 Apache 官方归档页Archive。2.1 官方归档页定位与版本选择逻辑Tomcat 8 分两个主线8.0.x 系列最低支持 JDK 7最高兼容 JDK 8已停止维护最后版本为8.0.532018-068.5.x 系列最低支持 JDK 7推荐用于 JDK 8 环境最后稳定版为8.5.992023-12 发布实为社区维护分支非 Apache 官方发布但经广泛验证可用提示不要选8.5.0或8.5.1这类早期版本——它们存在AsyncContext#dispatch()空指针漏洞CVE-2016-5425且对 Spring Boot 1.5 兼容性差也不要选8.5.99之前的8.5.90版本部分镜像站打包时误删了lib/ecj-4.7.3a.jarJSP 编译器导致 JSP 页面 500 错误无日志。正确路径打开 https://archive.apache.org/dist/tomcat/tomcat-8/进入v8.5.99/bin/目录下载apache-tomcat-8.5.99.zipWindows或apache-tomcat-8.5.99.tar.gzLinux/macOS同时下载对应 SHA512 校验文件apache-tomcat-8.5.99.zip.sha5122.2 下载后必须做的三步校验校验不是形式主义是防止“下载完成即中毒”的第一道防线。某高校实验室曾因镜像站提供篡改版startup.bat内嵌远程 PowerShell 下载器导致整批测试服务器被横向渗透。步骤 1校验 SHA512 值Windows PowerShell# 进入下载目录假设文件在 D:\download cd D:\download # 计算下载文件的 SHA512 (Get-FileHash apache-tomcat-8.5.99.zip -Algorithm SHA512).Hash # 输出类似A1B2C3D4...64位十六进制字符串 # 打开 apache-tomcat-8.5.99.zip.sha512 文件提取冒号后的内容去掉空格和换行 # 两者完全一致才通过步骤 2解压后检查关键文件是否存在防删减包解压到纯英文、无空格、无中文路径如C:\tools\tomcat8然后确认以下文件一个都不能少路径必须存在作用说明bin/catalina.batWin /bin/catalina.shLinux✅启动核心脚本缺则无法启动conf/server.xml✅主配置文件缺则启动报Cannot find specified filelib/catalina.jar✅容器核心类库缺则ClassNotFoundException: org.apache.catalina.startup.Bootstraplib/tomcat-juli.jar✅日志门面实现缺则java.util.logging.manager初始化失败日志全丢webapps/ROOT/✅默认首页目录空则访问localhost:8080显示 404注意webapps/examples/可以没有演示应用非必需但webapps/ROOT/下必须有index.jsp或index.html否则首页 404 是正常现象不是安装失败。步骤 3快速验证解压完整性5 秒判断在解压根目录执行# WindowsCMD dir /s /b | findstr /i jar\|xml\|bat | find /c : # 正常应输出 ≥ 120 行jar 包约 40xml 配置约 10bat/sh 脚本约 15# Linux/macOS find . -name *.jar -o -name *.xml -o -name *.sh -o -name *.bat | wc -l # 正常应输出 ≥ 120如果远低于该数值如只有 30 行说明是删减包或解压损坏立即重下。3. JDK 兼容性配置Tomcat 8 不吃 JDK 11但可以“骗过”JDK 17Tomcat 8.5.x 官方声明支持 JDK 7/8实际测试中可在 JDK 11 上运行需关闭 TLS 1.3但在 JDK 17 会直接抛UnsupportedClassVersionError或NoClassDefFoundError: javax/xml/bind/DatatypeConverter。这不是 bug是 Java 模块系统的硬性隔离。但很多生产环境已升级 JDK又不能降级——这时需要“兼容模式”启动。3.1 精确匹配 JDK 版本推荐用于新部署Tomcat 8.x 版本推荐 JDK必须关闭的模块JDK 11启动参数示例8.5.0 – 8.5.34JDK 8u202—JAVA_HOMEC:\Program Files\Java\jdk1.8.0_2028.5.35 – 8.5.99JDK 8u301 或 JDK 11.0.15--add-modules java.xml.bind-Djava.endorsed.dirs--add-modules java.xml.bind8.5.99社区版JDK 17.0.8--add-opens java.base/java.langALL-UNNAMED --add-opens java.base/java.nioALL-UNNAMED见下方完整命令注意“JDK 17 兼容”仅适用于8.5.99社区维护版官方8.5.98及之前版本在 JDK 17 下必崩。3.2 在 JDK 17 环境下启动 Tomcat 8.5.99实测通过步骤 1设置 JAVA_HOME绝对路径无空格# Windows CMD临时生效推荐 set JAVA_HOMEC:\jdk-17.0.8 set PATH%JAVA_HOME%\bin;%PATH%# Linux/macOS写入 ~/.bashrc 或 ~/.zshrc export JAVA_HOME/usr/lib/jvm/jdk-17.0.8 export PATH$JAVA_HOME/bin:$PATH步骤 2修改bin/catalina.batWindows或bin/catalina.shLinux在catalina.bat文件末尾call %EXECUTABLE% start %CMD_LINE_ARGS%上方插入rem JDK 17 兼容补丁 set JAVA_OPTS%JAVA_OPTS% --add-opens java.base/java.langALL-UNNAMED set JAVA_OPTS%JAVA_OPTS% --add-opens java.base/java.nioALL-UNNAMED set JAVA_OPTS%JAVA_OPTS% --add-opens java.base/sun.nio.chALL-UNNAMED set JAVA_OPTS%JAVA_OPTS% --add-opens java.management/sun.managementALL-UNNAMED在catalina.sh文件中找到JAVA_OPTS$JAVA_OPTS行在其后添加JAVA_OPTS$JAVA_OPTS --add-opens java.base/java.langALL-UNNAMED JAVA_OPTS$JAVA_OPTS --add-opens java.base/java.nioALL-UNNAMED JAVA_OPTS$JAVA_OPTS --add-opens java.base/sun.nio.chALL-UNNAMED JAVA_OPTS$JAVA_OPTS --add-opens java.management/sun.managementALL-UNNAMED步骤 3禁用 TLS 1.3避免 Connector 启动失败打开conf/server.xml找到Connector port8080行确保protocol属性为Connector port8080 protocolorg.apache.coyote.http11.Http11NioProtocol connectionTimeout20000 redirectPort8443 /严禁写成Http11Nio2ProtocolNIO2 需 JDK 11 且需额外配置或Http11AprProtocol需安装 APR 库。如果看到sslEnabledProtocolsTLSv1.3请删除整行或改为sslEnabledProtocolsTLSv1,TLSv1.1,TLSv1.2。逻辑说明Http11NioProtocol是 Tomcat 8.5 默认且最稳定的 HTTP 处理器基于 JDK NIO无需额外 native 库Http11Nio2Protocol虽性能略优但要求 JDK 11 且server.xml中必须显式声明useSendfilefalse否则 Windows 下必报java.io.IOException: The handle is invalid。4. 配置避坑三个看似合理、实则让 Tomcat 启动即静默退出的致命配置Tomcat 8 启动失败最痛苦的不是报错而是控制台闪退、日志为空、进程不存在。这往往源于三个“看起来很安全”的配置改动。我见过某公司运维连续三天重装系统就因为conf/logging.properties里一行1catalina.org.apache.juli.AsyncFileHandler.level FINE导致异步日志器初始化失败整个日志系统瘫痪catalina.out一行为 0。4.1conf/server.xml中的 Connector 配置陷阱❌ 错误写法port-1或port0Connector port-1 protocolHTTP/1.1 ... / !-- 或 -- Connector port0 protocolHTTP/1.1 ... /现象startup.bat执行后立即退出ps aux | grep tomcat查不到进程catalina.out为空。原因Tomcat 8 不支持动态端口分配port0是 Tomcat 9 特性port-1会被解析为非法端口Bootstrap 直接 return不写日志。解决严格使用port8080或其它合法端口1024–65535。❌ 错误写法redirectPort指向已被占用的端口Connector port8080 redirectPort8080 ... /现象启动成功但访问http://localhost:8080返回 404 或空白页catalina.out无错误。原因redirectPort用于 HTTP→HTTPS 重定向若设为自身端口会触发无限重定向循环Tomcat 内部检测到后静默关闭该 Connector不报错。解决redirectPort必须指向另一个未被占用的 HTTPS 端口如8443且该端口在server.xml中必须有对应的Connector port8443 protocolorg.apache.coyote.http11.Http11NioProtocol schemehttps securetrue ... /。4.2bin/setenv.batWindows中的 CLASSPATH 误加某些教程建议在setenv.bat中添加set CLASSPATH%CATALINA_HOME%\lib\mysql-connector-java-8.0.33.jar来预加载 JDBC 驱动。这是 Tomcat 8 的大忌。现象startup.bat执行后控制台显示Using CATALINA_BASE: ...然后立即关闭catalina.out最后一行是INFO: Initialization processed in 123 ms再无后续。原因Tomcat 8 的 Bootstrap 类加载器org.apache.catalina.startup.Bootstrap在初始化时会扫描CLASSPATH中的所有 jar若遇到不兼容的 Java 类如 MySQL 8 驱动依赖java.sql.Driver新接口会静默跳过并终止初始化流程。解决JDBC 驱动必须放在lib/目录下绝不可通过CLASSPATH注入。setenv.bat中只允许设置JAVA_OPTS、CATALINA_OPTS、JAVA_HOME。4.3conf/web.xml中的 welcome-file-list 顺序错误welcome-file-list welcome-fileindex.html/welcome-file welcome-fileindex.htm/welcome-file welcome-fileindex.jsp/welcome-file /welcome-file-list现象http://localhost:8080显示 404但http://localhost:8080/index.jsp可正常访问。原因Tomcat 8 默认webapps/ROOT/下只有index.jsp没有index.html。当welcome-file-list中index.html排第一时容器按序查找找到index.html不存在即返回 404不再继续查index.jsp。解决将index.jsp移至第一行或直接删除index.html和index.htm行只留welcome-fileindex.jsp/welcome-file。常见问题排查口诀控制台闪退 → 查JAVA_HOME路径、bin/catalina.bat开头是否被注释、port值是否合法catalina.out为空 → 查conf/logging.properties中handlers是否被注释、1catalina.org.apache.juli.AsyncFileHandler.level是否设为OFF能启动但 404 → 查webapps/ROOT/是否真有文件、conf/web.xml欢迎页顺序、server.xml中Host的appBase是否指向webapps5. 启动验证与日志诊断用三行命令定位 90% 的启动失败装完不是终点验证才是。Tomcat 8 的日志体系分三层catalina.out标准输出重定向、logs/catalina.YYYY-MM-DD.log框架日志、logs/localhost.YYYY-MM-DD.logWeb 应用日志。多数人只看catalina.out却错过真正线索。5.1 启动前必做端口与权限检查在启动前先执行# Windows管理员 CMD netstat -ano | findstr :8080 # 若有输出说明端口被占记下 PID用 tasklist | findstr PID 查进程名 # 强制杀taskkill /f /pid PID号# Linux/macOS sudo lsof -i :8080 # 或 ss -tuln | grep :8080 # 若被占kill -9 PID提示Windows 下netstat可能因权限不足不显示 PID此时用Get-NetTCPConnection -LocalPort 8080 | Select-Object -Property OwningProcessPowerShell更准。5.2 启动时强制输出到控制台绕过 catalina.out 重定向默认startup.bat会把输出重定向到catalina.out不利于实时观察。临时调试时直接运行# Windows cd bin catalina.bat run# Linux/macOS cd bin ./catalina.sh runrun参数让 Tomcat 前台运行所有日志直接打印在当前终端CtrlC 可中断。这是定位“启动卡住”的唯一可靠方式。5.3 日志关键词精准定位法附速查表当catalina.out或终端输出出现以下关键词按表处理关键词大小写敏感含义立即检查项SEVERE: Failed to initialize connectorConnector 初始化失败conf/server.xml中port、protocol、redirectPort值netstat端口占用Caused by: java.lang.ClassNotFoundException: javax.servlet.FilterServlet API 缺失lib/servlet-api.jar是否存在CATALINA_HOME路径是否含空格Windowsjava.util.logging.ErrorManager: Error parsing filelogging.properties格式错误用记事本打开conf/logging.properties检查是否有 BOM 头、中文字符、多余空格The APR based Apache Tomcat Native library was not foundAPR 库缺失可忽略此为 INFO 级提示非错误若未配AprLifecycleListener可安全忽略java.lang.OutOfMemoryError: Metaspace元空间溢出JDK 8在bin/setenv.bat中添加set JAVA_OPTS-XX:MetaspaceSize256m -XX:MaxMetaspaceSize512m5.4 验证首页成功的黄金组合三步闭环启动成功标志终端输出最后三行必须包含INFO: Server startup in [xxx] milliseconds INFO: Deployment of web application directory [...\webapps\ROOT] has finished in [yyy] ms INFO: Starting ProtocolHandler [http-nio-8080]网络可达验证绕过浏览器缓存curl -I http://localhost:8080 # 应返回 HTTP/1.1 200 OK不是 302 或 404页面内容验证确认 ROOT 应用加载curl http://localhost:8080 | head -20 | findstr Apache Tomcat # Windows curl http://localhost:8080 | head -20 | grep Apache Tomcat # Linux/macOS # 应输出包含 If youre seeing this, youve successfully installed... 的 HTML 片段从那以后我每次部署 Tomcat 8都强制走一遍catalina.bat runcurl -Icurl \| head三连。哪怕只是本地测试也绝不依赖双击startup.bat——那玩意儿就像个黑匣子你永远不知道它把错误日志吐到哪个角落去了。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

纯OpenCV车牌识别实战:零深度学习的鲁棒LPR方案

纯OpenCV车牌识别实战:零深度学习的鲁棒LPR方案

简介:本资源是一套基于Python与OpenCV实现的完整车牌识别系统源码及配套数据集,面向计算机视觉初学者、图像处理课程实践者及智能交通方向项目开发者,解决从图像预处理、车牌定位、字符分割到OCR识别的全流程技术落地问题。压缩包共30个文件&…

2026/10/18 21:57:18 阅读更多 →
HTML语义化标签与整站结构规划:从基础到实战

HTML语义化标签与整站结构规划:从基础到实战

写前端久了你会发现一个很有意思的现象:很多人觉得HTML太简单,简单到不值得单独拿出一篇文章来讲。但恰恰是这种“简单”,让不少项目在后期付出了成倍的返工代价。HTML网页结构搭建这件事,不是说你用了某种标签就行,而…

2026/10/18 21:57:18 阅读更多 →
DeepSeek    LeetCode 377. 组合总和 Ⅳ Java实现

DeepSeek LeetCode 377. 组合总和 Ⅳ Java实现

LeetCode 377. 组合总和 Ⅳ Java 实现 题目分析 给定一个由不同正整数组成的数组 nums 和一个目标整数 target,求有多少种不同的组合方式使得和为 target。顺序不同的组合视为不同(即求排列数)。 例如 nums [1,2,3], target 4,共…

2026/10/18 21:57:18 阅读更多 →

最新新闻

React前端工程化架构实践:响应式、可扩展、可维护的rea式设计

React前端工程化架构实践:响应式、可扩展、可维护的rea式设计

1. 从“rea”这个标题说起:一个被低估的缩写背后藏着什么第一次看到“rea”这个标题的时候,我承认自己愣了几秒。三个字母,没有上下文,没有说明,放在任何一个技术社区里都像是某种暗号。但恰恰是这种极简的命名方式&am…

2026/10/18 22:47:54 阅读更多 →
uni-app轨迹回放全攻略:定位采集、抽稀与动画调度实战

uni-app轨迹回放全攻略:定位采集、抽稀与动画调度实战

最近在做一个外勤场景的 uni-app 项目,业务方提了个需求:把当天某个配送员的行驶轨迹回放出来,要能暂停、能变速、能拖进度条。我当时以为这事很简单——把一串经纬度画到地图上不就行了?真动手才发现,轨迹回放在 uni-…

2026/10/18 22:47:54 阅读更多 →
数据结构课设实战:手写堆与链表实现任务调度器

数据结构课设实战:手写堆与链表实现任务调度器

简介:一套基于C/C实现的任务调度器课程设计源码,面向计算机专业大二学生,旨在解决数据结构课程设计中任务调度系统的设计与实现问题,适用于VS2019环境。压缩包共38个文件,以hpp头文件、cpp源文件、vcxproj工程文件等源…

2026/10/18 22:47:54 阅读更多 →
Vue3 + OpenLayers 大屏可视化基础模版:解决白屏卡顿图层错乱

Vue3 + OpenLayers 大屏可视化基础模版:解决白屏卡顿图层错乱

简介:这是一套面向前端开发者与地理信息系统(GIS)初学者的大屏可视化基础模板,聚焦Vue.js与OpenLayers融合开发,解决大屏项目中地图集成难、组件复用低、响应适配弱等常见问题,适用于监控中心、城市治理、能…

2026/10/18 22:47:54 阅读更多 →
Unity血条制作全指南:从Slider到FillAmount与性能优化

Unity血条制作全指南:从Slider到FillAmount与性能优化

很多新人在做Unity血条的时候,第一个想法都是“拖一个Slider,然后把value绑到血量上”,但等真正接到项目里,才发现问题远比想象的多:血条更新不及时、换装备后属性乱跳、Boss战时同屏几十根血条直接掉帧、伤害飘字和血…

2026/10/18 22:47:54 阅读更多 →
Chaste细胞群体动力学仿真实操:从项目搭建到结果可视化

Chaste细胞群体动力学仿真实操:从项目搭建到结果可视化

上一篇文章讲完 Chaste 的安装和基础概念,后台不少同行留言说:环境装好了,可真正打开一个仿真项目时还是很懵,不知道从哪里下手。这篇我就把自己用 Chaste 跑细胞群体动力学仿真的完整操作路径梳理一遍,从项目结构到核…

2026/10/18 22:46:51 阅读更多 →

日新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

月新闻

我发现了一个新思路:用 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/18 0:55:02 阅读更多 →
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/18 12:16:16 阅读更多 →