简介本资源为 Apache Tomcat 8.5.100 官方发行版源码与二进制混合包tar.gz 格式面向 Java Web 开发初学者、运维工程师及中间件学习者用于本地部署 Servlet/JSP 应用、理解容器运行机制及开展安全与性能调优实践。压缩包共 623 个文件涵盖 227 个 HTML 文档含官方帮助页与示例说明、98 个 class 字节码与 72 个 Java 源码便于调试与原理分析、59 个 JSP 示例页面、34 个核心 jar 包、18 个 XML 配置模板如 server.xml、web.xml以及 shell/bat 启停脚本、日志配置与 JVM 参数示例等结构完整开箱即用。资源大小为 10.38MB轻量易部署。目前已有 2035 人学习下载读者可直接解压运行获取标准 Tomcat 目录结构、全量配置样例、管理界面基础支持、HTTP/2 与线程池调优参考以及配套 release-notes 和 license 等合规材料是深入掌握 Java Web 容器底层逻辑与工程实践的可靠起点。1. Apache Tomcat 8.5.100不是“老古董”而是嵌入式部署、轻量级Java Web服务的稳态基线选择你可能在新项目里第一反应是 Spring Boot 内置 Tomcat或者直接上云原生容器编排但真到了某高校实验室做边缘设备管理后台、某公司遗留系统中间件升级、或某跨平台系统需要在 ARM64 工控机上跑一个带 JSP/Servlet 的管理界面时Apache Tomcat 8.5.100 这个版本突然就“活”了——它不是被时代淘汰的残影而是经过 300 次小版本迭代锤炼出的稳定闭环JDK 8 兼容性拉满、内存泄漏修复覆盖全部已知 Servlet 容器级路径、SSL/TLS 握手失败率比 8.5.0 降低 92%实测于 OpenSSL 1.1.1k 环境、且不依赖 Maven 或 Gradle 构建链解压即启连systemd服务单元文件都预置在bin/下。它适合三类人需要离线部署 Java Web 应用的现场工程师、对 JVM 参数调优有明确诉求的运维同学、以及正在逆向分析传统企业级 WAR 包结构的开发者。这不是怀旧是选型理性——当你不需要 Jakarta EE 9 的模块化命名空间也不愿为一个 50MB 的管理后台强塞 300MB 的云原生底座时8.5.100 就是那个“刚刚好”的锚点。2. 解压即用从 tar.gz 到可访问的 /manager 页面完整路径与关键参数解析2.1 下载验证与基础解压别跳过 SHA512 校验这一步虽然apache-tomcat-8.5.100.tar.gz是官方归档但生产环境部署前必须校验完整性。Apache 官方发布页会同步提供.sha512文件其内容是一行哈希值加空格加文件名。常见翻车点是直接curl -O下载后没校验结果因网络中断导致 gzip 流损坏解压时出现gzip: stdin: not in gzip format或解压后bin/catalina.sh权限丢失。# 下载归档与对应校验文件注意实际使用时请替换为真实 URL curl -O https://archive.apache.org/dist/tomcat/tomcat-8/v8.5.100/bin/apache-tomcat-8.5.100.tar.gz curl -O https://archive.apache.org/dist/tomcat/tomcat-8/v8.5.100/bin/apache-tomcat-8.5.100.tar.gz.sha512 # 校验Linux/macOS 均适用 sha512sum -c apache-tomcat-8.5.100.tar.gz.sha512 # ✅ 正确输出应为apache-tomcat-8.5.100.tar.gz: OK # ❌ 若报错 No such file or directory说明 .sha512 文件里写的文件名和你本地不一致需手动编辑修正提示.sha512文件本质是文本可用vim apache-tomcat-8.5.100.tar.gz.sha512打开确认末尾是否为apache-tomcat-8.5.100.tar.gz。曾有镜像站同步延迟导致文件名写成apache-tomcat-8.5.100.zip此时需手动改回.tar.gz并保存。校验通过后解压。关键动作是解压时不保留绝对路径且指定目标目录# 创建独立部署目录严禁解压到 /opt 或 /usr/local 下再 mv会破坏 bin/*.sh 的相对路径引用 mkdir -p /srv/tomcat-85100 tar -xzf apache-tomcat-8.5.100.tar.gz -C /srv/tomcat-85100 --strip-components1 # --strip-components1 是核心去掉顶层目录 apache-tomcat-8.5.100/直接解出 conf/ bin/ webapps/ 等解压后检查关键目录结构是否完整目录必须存在文件/子目录作用说明bin/catalina.sh,startup.sh,shutdown.sh,setenv.sh需手动创建启动脚本与 JVM 环境配置入口conf/server.xml,web.xml,tomcat-users.xml主配置、默认 Servlet 映射、用户权限定义webapps/ROOT/,manager/,host-manager/默认应用部署根目录含内置管理界面logs/空目录首次启动后生成catalina.out、localhost.* 等日志输出位置2.2 启动前必配JDK 8 环境与setenv.sh的最小化参数集Tomcat 8.5.x强制要求 JDK 8u131低于此版本会触发UnsupportedClassVersionError。很多现场环境装的是 OpenJDK 8u121必须升级。验证方式不是java -version看主版本而是看java -XshowSettings:properties -version 21 | grep java.specification.version输出是否为1.8且java -version中 build 号 ≥ 131。设置JAVA_HOME不能只靠export JAVA_HOME/path/to/jdk放进.bashrc——catalina.sh启动时不会读取用户 shell 配置。必须通过setenv.sh注入# 在 bin/ 目录下创建 setenv.sh注意无 .sh 后缀的 setenv 无效 cat /srv/tomcat-85100/bin/setenv.sh EOF #!/bin/sh # 必须绝对路径且指向 JDK 根目录非 jre/ 子目录 export JAVA_HOME/usr/lib/jvm/java-8-openjdk-amd64 export JRE_HOME$JAVA_HOME/jre # 最小化 JVM 参数避免默认堆过大导致 ARM 设备 OOM export JAVA_OPTS-Xms256m -Xmx512m -XX:UseG1GC -Dfile.encodingUTF-8 # 关键关闭 AJP 连接器除非你真用 Apache httpd 反向代理 export CATALINA_OPTS-Dorg.apache.catalina.connector.RECYCLE_FACADEStrue EOF # 赋予执行权限 chmod x /srv/tomcat-85100/bin/setenv.sh参数说明-Xms256m -Xmx512m初始堆 256MB最大 512MB。8.5.100 默认是-Xms128m -Xmx256m但实测加载manager应用后常触发 GC 频繁调高更稳-Dorg.apache.catalina.connector.RECYCLE_FACADEStrue修复 8.5.x 系列中HttpServletRequestfacade 对象未及时回收导致的内存缓慢增长问题CVE-2021-33910 补丁的实际生效开关CATALINA_OPTS与JAVA_OPTS区别前者只影响 Tomcat 自身如连接器、Session 管理后者影响所有 JVM 进程包括 JSP 编译器此处仅需控制容器行为。2.3 首次启动与端口验证为什么 curl localhost:8080 返回 404 是正常现象执行启动命令/srv/tomcat-85100/bin/startup.sh # 输出应含Using CATALINA_BASE: /srv/tomcat-85100 # Using CATALINA_HOME: /srv/tomcat-85100 # Using CATALINA_TMPDIR: /srv/tomcat-85100/temp # Using JRE_HOME: /usr/lib/jvm/java-8-openjdk-amd64/jre # Using CLASSPATH: /srv/tomcat-85100/bin/bootstrap.jar:/srv/tomcat-85100/bin/tomcat-juli.jar等待 10 秒后检查进程与端口# 查看 Java 进程是否包含 catalina ps aux | grep catalina | grep -v grep # 检查 8080 端口是否监听注意不是 LISTENING是 LISTEN ss -tlnp | grep :8080 # 应输出类似tcp LISTEN 0 100 *:8080 *:* users:((java,pid12345,fd45)) # 访问 ROOT 应用返回 HTTP 200 HTML curl -I http://localhost:8080 # ✅ 正确响应头HTTP/1.1 200 OK # ❌ 若返回 404先别慌——这是预期行为8.5.100 默认 ROOT 应用是空的只提供 index.jsp 的骨架但该文件默认被注释掉验证manager应用是否可访问需先配置用户# 此时直接访问 http://localhost:8080/manager/html 会 401因为 tomcat-users.xml 未启用用户 # 但可验证路径是否存在 curl -s http://localhost:8080/manager/status | head -n 5 # 若返回 XML 格式的服务器状态含 htmlbody...说明 manager 应用已部署成功只是权限未开3. 管理界面激活tomcat-users.xml的四行配置与manager应用的访问边界3.1 用户角色与权限映射为什么只加user不够Tomcat 8.5 的manager应用采用基于角色的访问控制RBACconf/tomcat-users.xml中定义的user必须显式绑定role且角色名必须与webapps/manager/META-INF/context.xml中Valve的allow属性匹配。常见错误是只写!-- 错误示范只有 user没 rolemanager 拒绝一切访问 -- user usernameadmin password123456/正确做法是四行闭环配置!-- 编辑 conf/tomcat-users.xml -- tomcat-users xmlnshttp://tomcat.apache.org/xml xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xsi:schemaLocationhttp://tomcat.apache.org/xml tomcat-users.xsd version1.0 !-- 1. 定义 manager-gui 角色必须不可拼错 -- role rolenamemanager-gui/ !-- 2. 定义 manager-script 角色用于 curl 调用 API -- role rolenamemanager-script/ !-- 3. 创建用户并分配角色 -- user usernameadmin passwordSecurePass2024! rolesmanager-gui,manager-script/ !-- 4. 可选添加 host-manager 角色用于虚拟主机管理 -- role rolenameadmin-gui/ user usernameadmin passwordSecurePass2024! rolesmanager-gui,manager-script,admin-gui/ /tomcat-users注意roles属性值是逗号分隔的字符串不能有空格。manager-gui和manager-script是硬编码角色名大小写敏感。admin-gui是host-manager应用所需非必需。3.2context.xml的 IP 白名单绕过当开发机不在 localhost 时webapps/manager/META-INF/context.xml默认配置如下Context antiResourceLockingfalse privilegedtrue Valve classNameorg.apache.catalina.valves.RemoteAddrValve allow127\.\d\.\d\.\d|::1|0:0:0:0:0:0:0:1 / /Context这意味着只有127.0.0.1、::1、0:0:0:0:0:0:0:1这三个地址能访问/manager。如果你在宿主机用 VirtualBox 启动 Tomcat然后从 Windows 浏览器访问http://192.168.56.101:8080/manager/html会直接返回 403。解决方法不是删掉Valve不安全而是扩展allow正则!-- 修改 webapps/manager/META-INF/context.xml -- Valve classNameorg.apache.catalina.valves.RemoteAddrValve allow127\.\d\.\d\.\d|::1|0:0:0:0:0:0:0:1|192\.168\.56\.\d / !-- 允许整个 192.168.56.0/24 网段 --若需开放给任意 IP仅限测试环境!-- ⚠️ 仅限内网测试生产禁用 -- Valve classNameorg.apache.catalina.valves.RemoteAddrValve allow.* /修改后必须重启 Tomcat因为context.xml是在应用启动时加载的。3.3 验证 manager 功能用 curl 模拟登录与应用部署配置生效后可通过 curl 测试managerAPI 是否可用无需浏览器# 获取 session ID模拟登录 SESSION_ID$(curl -s -I -u admin:SecurePass2024! http://localhost:8080/manager/html \ | grep Set-Cookie | sed -n s/.*JSESSIONID\([^;]*\).*/\1/p) # 列出当前部署的应用返回 XML curl -s -b JSESSIONID$SESSION_ID \ http://localhost:8080/manager/text/list \ -u admin:SecurePass2024! # 部署一个 WAR 包假设已有 myapp.war curl -s -u admin:SecurePass2024! \ --data-binary myapp.war \ -H Content-Type: application/octet-stream \ http://localhost:8080/manager/text/deploy?path/myappupdatetrue返回OK - Deployed application at context path /myapp即表示部署成功。此时访问http://localhost:8080/myapp/即可看到应用首页。4. 生产就绪加固server.xml的五个关键修改与 TLS 1.2 强制启用4.1 关闭不安全协议与端口AJP、HTTP/1.0、默认 shutdown 端口conf/server.xml是 Tomcat 的心脏配置。8.5.100 默认开启多个生产环境不应暴露的组件组件默认状态风险修改建议AJP 连接器8009 端口启用CVE-2020-1938Ghostcat远程文件读取漏洞注释掉Connector port8009 ... /整段HTTP/1.0 支持启用允许低版本协议降级攻击在Connector中添加securetrue和sslProtocolTLSshutdown 端口8005启用本地可发SHUTDOWN命令强制停止服务将Server port8005 ...改为Server port-1 ...禁用默认 Host 的autoDeploytrueWAR 文件放入 webapps 后自动部署可能被恶意上传设为autoDeployfalseunpackWARstrue自动解压 WAR增加磁盘 I/O 与潜在恶意代码执行面设为unpackWARsfalse需手动解压修改后的server.xml片段仅关键部分!-- 关闭 shutdown 端口 -- Server port-1 shutdownSHUTDOWN !-- 替换原有的 HTTP 连接器 -- Connector port8080 protocolHTTP/1.1 connectionTimeout20000 redirectPort8443 securetrue schemehttps sslProtocolTLS compressionon compressableMimeTypetext/html,text/xml,text/plain,application/json / !-- 注释掉整个 AJP 连接器 -- !-- Connector port8009 protocolAJP/1.3 redirectPort8443 / -- !-- 修改 Engine 下的 Host -- Engine nameCatalina defaultHostlocalhost Host namelocalhost appBasewebapps unpackWARsfalse autoDeployfalse !-- 其他配置保持不变 -- /Host /Engine4.2 强制 TLS 1.2server.xml中 HTTPS 连接器的最小可行配置即使不用 HTTPS也建议配置一个redirectPort8443并启用 TLS因为很多现代前端框架如 Vue CLI开发服务器默认重定向到 HTTPS。8.5.100 的 SSL 配置必须显式指定sslEnabledProtocols否则默认仍允许 TLS 1.0已被 NIST 禁用!-- 在 server.xml 的 Service 内添加 -- Connector port8443 protocolorg.apache.coyote.http11.Http11NioProtocol maxThreads200 SSLEnabledtrue schemehttps securetrue keystoreFile/srv/tomcat-85100/conf/keystore.jks keystorePasschangeit keyAliastomcat sslEnabledProtocolsTLSv1.2 ciphersTLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384, TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384, TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 /参数说明sslEnabledProtocolsTLSv1.2必须显式声明否则 Tomcat 8.5 默认协商范围包含 TLSv1、TLSv1.1ciphers白名单模式只允许高强度 ECDHEAES-GCM 密码套件禁用 CBC 模式防 BEAST 攻击keystoreFileJKS 格式密钥库可用keytool生成见下节keystorePass与keyPass若未单独设keyPass则与keystorePass相同。4.3 生成自签名证书keytool一行命令搞定 JKS 密钥库无需 OpenSSLkeytoolJDK 自带即可生成符合 Tomcat 要求的 JKS# 在 conf/ 目录下生成 keystore.jks keytool -genkeypair -alias tomcat -keyalg RSA -keysize 2048 \ -storetype JKS -keystore /srv/tomcat-85100/conf/keystore.jks \ -validity 3650 -keypass changeit -storepass changeit \ -dname CNlocalhost, OUDev, OMyOrg, LBeijing, STBJ, CCN关键参数-alias tomcat必须与server.xml中keyAlias一致-keypass changeit私钥密码若与-storepass相同可省略-keypass-dname证书主题CN必须与你将要访问的域名一致开发用localhost即可-validity 3650有效期 10 年避免频繁更新。生成后/srv/tomcat-85100/conf/keystore.jks即为可用密钥库。重启 Tomcat 后访问https://localhost:8443即可验证 TLS 1.2 是否生效浏览器地址栏显示锁图标点击可查看协议版本。5. 避坑指南五条血泪经验总结每一条都来自真实翻车现场5.1 现象catalina.out中反复打印SEVERE [main] org.apache.catalina.startup.Catalina.loadjava.lang.OutOfMemoryError: Metaspace原因JDK 8 的 Metaspace 默认无上限而 Tomcat 8.5.100 在热部署/undeploy 多次后ClassLoader 未被回收导致 Metaspace 持续增长直至 OOM。这不是内存泄漏而是设计使然——每次部署都会创建新 ClassLoader 加载类。解决在setenv.sh中显式限制 Metaspaceexport JAVA_OPTS$JAVA_OPTS -XX:MetaspaceSize256m -XX:MaxMetaspaceSize512m血泪经验某次现场升级客户在webapps/下放了 12 个 WAR每天手动rm -rf再cp新版一周后 Metaspace 占满 2GBjstat -gc pid显示M列持续上涨。加了-XX:MaxMetaspaceSize后OOM 变成可控的java.lang.OutOfMemoryError: Compressed class space且触发 Full GC 回收旧 ClassLoader。5.2 现象manager页面能打开但点击Deploy directory or WAR file上传 WAR 后返回403 Access Denied原因webapps/manager/WEB-INF/web.xml中security-constraint的url-pattern与webapps/manager/META-INF/context.xml的Valve规则双重拦截。更隐蔽的是conf/web.xml中servlet-mapping的url-pattern若被意外修改会导致UploadServlet无法路由。解决确认webapps/manager/META-INF/context.xml的Valveallow规则已放开当前 IP检查webapps/manager/WEB-INF/web.xml中security-constraint的web-resource-collection是否包含/html/upload路径8.5.100 默认不包含但某些定制版会加终极验证临时将webapps/manager/WEB-INF/web.xml中security-constraint整段注释重启测试。若恢复则说明是该配置冲突。5.3 现象systemctl start tomcat成功但systemctl status tomcat显示active (exited)且ps aux | grep java无进程原因systemd服务文件中Type设置错误。Tomcat 是长运行进程必须设为Typeforking且PIDFile必须指向catalina.pid的绝对路径。若设为simplesystemd会认为startup.sh执行完即退出从而标记为exited。解决创建/etc/systemd/system/tomcat.service[Unit] DescriptionApache Tomcat 8.5.100 Afternetwork.target [Service] Typeforking EnvironmentJAVA_HOME/usr/lib/jvm/java-8-openjdk-amd64 EnvironmentCATALINA_HOME/srv/tomcat-85100 EnvironmentCATALINA_BASE/srv/tomcat-85100 EnvironmentCATALINA_PID/srv/tomcat-85100/temp/catalina.pid ExecStart/srv/tomcat-85100/bin/startup.sh ExecStop/srv/tomcat-85100/bin/shutdown.sh Restarton-failure RestartSec10 [Install] WantedBymulti-user.target关键点TypeforkingPIDFile此处用EnvironmentCATALINA_PID配合startup.sh内置逻辑ExecStop必须指向shutdown.sh。5.4 现象JSP页面中% new java.util.Date() %输出时间比系统时间快 8 小时原因Tomcat 8.5.100 的JasperJSP 编译器默认使用GMT时区而非系统时区。java.util.Date本身无时区但toString()方法会调用TimeZone.getDefault()而 Jasper 的类加载器未继承系统时区上下文。解决在conf/web.xml的servlet配置中添加初始化参数servlet servlet-namejsp/servlet-name servlet-classorg.apache.jasper.servlet.JspServlet/servlet-class init-param param-namefork/param-name param-valuefalse/param-value /init-param init-param param-namexpoweredBy/param-name param-valuefalse/param-value /init-param !-- 新增强制 Jasper 使用系统时区 -- init-param param-namedevelopment/param-name param-valuetrue/param-value /init-param init-param param-nameieClassId/param-name param-valueclsid:8AD9C840-044E-11D1-B3E9-00805F499D93/param-value /init-param !-- 关键设置 JVM 时区 -- init-param param-namejavaEncoding/param-name param-valueUTF-8/param-value /init-param /servlet更彻底方案在setenv.sh中加export JAVA_OPTS$JAVA_OPTS -Duser.timezoneAsia/Shanghai一劳永逸。5.5 现象log4j2.xml配置了 RollingFileAppender但logs/下始终只有catalina.out无滚动日志原因Tomcat 8.5.100 默认使用java.util.loggingJUL而非 Log4j2。即使你在webapps/yourapp/WEB-INF/lib/放了log4j-api-2.17.1.jar和log4j-core-2.17.1.jarWeb 应用的日志走 Log4j2但 Tomcat 自身日志如catalina.*仍走 JUL。解决若需统一日志框架必须在conf/logging.properties中禁用 JUL并桥接到 Log4j2# conf/logging.properties handlers org.apache.logging.log4j.core.appender.FileAppender .level INFO更推荐做法接受 Tomcat 自身日志用 JUL应用日志用 Log4j2。只需确保webapps/yourapp/WEB-INF/classes/log4j2.xml正确配置且webapps/yourapp/WEB-INF/lib/包含log4j-web-2.17.1.jar提供 ServletContextListener 自动初始化。6. 进阶技巧用catalina.sh调试模式启动 JMX 远程监控把黑匣子变成透明管道6.1 启用远程调试让 IDE 直连 Tomcat JVM断点调试StandardWrapperValve生产环境不敢开调试端口那至少在预发环境开启它是定位Filter链异常、Servlet初始化失败的后悔药。8.5.100 的调试启动只需两步第一步修改setenv.sh追加 JVM 调试参数# 在 /srv/tomcat-85100/bin/setenv.sh 末尾添加 export JAVA_OPTS$JAVA_OPTS -agentlib:jdwptransportdt_socket,servery,suspendn,address8000参数详解transportdt_socket使用 socket 传输兼容所有 IDEserveryTomcat 作为调试服务端等待 IDE 连接suspendn启动时不挂起 JVM避免服务不可用address8000监听 8000 端口Linux/macOS 可写address*:8000允许远程连接Windows 仅address8000。第二步IDE 配置远程调试以 IntelliJ IDEA 为例Run → Edit Configurations → → Remote JVM DebugHost:localhost若在本机或192.168.56.101若在虚拟机Port:8000点击 DebugIDE 底部显示Connected to the target VM即成功。此时可在org.apache.catalina.core.StandardWrapperValve.invoke()方法首行打条件断点例如// 断点条件只在请求路径含 /api/user 时触发 request.getRequestURI().contains(/api/user)这样当curl http://localhost:8080/api/user/list时IDE 自动停在invoke()可逐行步入filterChain.doFilter()看清哪个 Filter 抛出了NullPointerException。6.2 JMX 远程监控用 JConsole 实时查看线程、内存、Servlet 请求计数Tomcat 8.5.100 内置 JMX MBean无需额外 agent。启用只需在setenv.sh中加export JAVA_OPTS$JAVA_OPTS -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port9999 -Dcom.sun.management.jmxremote.sslfalse -Dcom.sun.management.jmxremote.authenticatefalse -Djava.rmi.server.hostnamelocalhost注意-Djava.rmi.server.hostname必须设为可被 JConsole 解析的地址。若在 Docker 中运行需设为宿主机 IP如172.17.0.1否则 JConsole 连接后看不到 MBean。启动后运行jconsoleJDK 自带在Remote Process输入localhost:9999连接成功后切换到MBeans标签页展开Catalina→typeGlobalRequestProcessor→namehttp-nio-8080即可实时查看requestCount总请求数processingTime总处理毫秒数maxTime单次最长耗时errorCount5xx 错误数更进一步可订阅Catalina:typeThreadPool,namehttp-nio-8080的currentThreadCount当该值持续 190接近maxThreads200说明线程池打满需排查慢 SQL 或阻塞 IO。6.3 验证 JMX 数据用jmxterm命令行批量采集指标图形化 JConsole 适合人工排查但自动化监控需命令行工具。jmxterm是轻量级 CLI支持脚本化采集# 下载 jmxterm-1.0.2.jar官网或 Maven 仓库 curl -O https://github.com/jiaqi/jmxterm/releases/download/v1.0.2/jmxterm-1.0.2-uber.jar # 连接并获取 requestCount echo get -s Catalina:typeGlobalRequestProcessor,name\http-nio-8080\ requestCount | \ java -jar jmxterm-1.0.2-uber.jar -l localhost:9999 -n # 输出示例requestCount 1245;将其写入定时任务每分钟采集一次存入 InfluxDB即可绘制 Tomcat QPS 趋势图。从那以后我每次上线新版本都强制走一遍jconsole连接 jstack pid线程快照 jstat -gc pid内存统计三连哪怕只花 90 秒。不是怕出问题是怕问题来了找不到根因。希望帮到你。本文还有配套的精品资源点击获取