简介apache-tomcat-7.0.103-windows-x64.zip 是面向 Java Web 初学者与中小型项目开发者的免安装 Tomcat 运行环境解压即可使用省去繁琐的配置步骤适合本地调试 Servlet、JSP 及部署轻量级 Web 应用。压缩包共 648 个文件约 10.38MB以 237 个 html 文档、106 个 class 字节码、78 个 java 源码、58 个 jsp 页面为主另含 30 个 jar 依赖库、15 个 xml 配置、11 个 properties 属性文件以及 bat 启动脚本、tld 标签库、xsd 校验文件等完整覆盖 Tomcat 的文档、源码与运行组件。目前已有 573 人学习下载说明该版本在 Windows 环境下具备稳定的使用基础。借助这份资源读者可直接获得可运行的 Tomcat 7.0.103 目录结构对照 conf 配置、webapps 示例与 bin 脚本理解容器启动流程快速搭建本地 Java Web 调试环境并借助自带文档排查端口占用、部署路径等常见问题。1. Tomcat 7.0.103 Windows 版一个老版本压缩包为什么还在被反复下载apache-tomcat-7.0.103-windows-x64.zip这个文件名做 Java Web 的人大概率在某个目录里见过。它不是一个新东西Tomcat 7 这条线早在多年前就停止了功能迭代7.0.103 是这条线上最后几个维护版本之一。但现实是很多内网系统、老政务项目、教学实验环境、遗留 ERP 的部署文档里写的还是这个包名。原因很直接老项目跑在 JDK 7 或 JDK 8 上Servlet 3.0 规范够用升级 Tomcat 8/9 反而可能因为 API 变动、配置项改名、JSP 编译行为差异导致启动失败。这个 zip 是 Windows 64 位免安装版解压即用不需要跑安装程序也不写注册表。它解决的核心问题是在一台 Windows 机器上快速拉起一个能跑 war 包和 JSP 的 Servlet 容器且不污染系统环境。适合谁维护遗留系统的后端、要交课程设计的学生、需要在本地复现生产环境问题的运维。如果你手上是全新项目我不会建议你从 7.0.103 起步但如果你面对的是一个只能跑在 Tomcat 7 上的老 war 包那这个压缩包就是最省事的路径。2. 解压之后先别急着 startup目录结构与三个环境变量2.1 解压路径的选择直接决定后续会不会翻车把 zip 解压到哪看起来是小事实际是后面一半问题的根源。我一般会固定放在一个没有空格、没有中文、路径尽量短的目录比如D:\server\tomcat7。原因有三个第一CATALINA_HOME里带空格时某些老版本启动脚本拼接 classpath 会出问题第二中文路径在 JSP 编译、日志输出、临时文件写入时容易出现编码异常第三路径太深会让 Windows 的路径长度限制在嵌套部署时被触发。解压完成后你会看到这些目录目录作用是否要动bin启动/停止脚本、bootstrap.jar改 setenv.batconfserver.xml、web.xml、tomcat-users.xml重点改lib容器自身依赖的 jar一般不动logs日志输出排错看这里temp临时文件可清理webapps部署目录放 war 或解压目录workJSP 编译产物出玄学问题先删work目录值得单独说一句。JSP 第一次访问会被编译成 Java 再编译成 class产物就在work下。当你改了 JSP 但页面没变化或者报一些莫名其妙的类找不到八成是work里的缓存和当前代码对不上。血泪经验删work再重启能解决相当一部分“我明明改了”的问题。2.2 三个环境变量和 setenv.bat 的写法Tomcat 在 Windows 上依赖两个核心环境变量JAVA_HOME和CATALINA_HOME。JAVA_HOME指向 JDK 根目录注意是 JDK 不是 JRE因为 JSP 编译需要tools.jarJDK 8 及以前或对应的编译器模块。CATALINA_HOME指向 Tomcat 解压根目录。# 在系统环境变量里设置示例路径按实际改 JAVA_HOME D:\java\jdk1.8.0_xxx CATALINA_HOME D:\server\tomcat7 # PATH 里追加 %JAVA_HOME%\bin %CATALINA_HOME%\bin设置完之后验证一下# 打开新的 cmd 窗口必须新开否则读不到新变量 echo %JAVA_HOME% echo %CATALINA_HOME% java -versionjava -version要能正常输出且版本要和 Tomcat 7 兼容。Tomcat 7.0.103 建议跑在 JDK 7 或 JDK 8 上用 JDK 11 及以上会有模块化相关的坑比如javax.xml.bind被移除导致启动报 ClassNotFoundException。比环境变量更灵活的做法是在bin目录下新建setenv.bat把 JVM 参数写进去这样不污染系统变量换机器也好迁移# D:\server\tomcat7\bin\setenv.bat set JAVA_OPTS-Xms512m -Xmx1024m -XX:MetaspaceSize128m -XX:MaxMetaspaceSize256m set JAVA_OPTS%JAVA_OPTS% -Dfile.encodingUTF-8 set CATALINA_OPTS-Djava.awt.headlesstrue逻辑说明JAVA_OPTS在启动和停止时都会生效CATALINA_OPTS只在启动时生效所以内存参数放哪个都行但只给启动用的参数比如 headless放CATALINA_OPTS更干净。-Xms和-Xmx分别是最小和最大堆老项目内存泄漏常见-Xmx别设太大否则出问题时机器直接卡死而不是抛 OOM反而不好定位。-Dfile.encodingUTF-8是防中文乱码的第一道保险但注意它不能解决所有乱码后面还会讲。3. 端口、编码、内存server.xml 里必须改的几处3.1 改端口和关闭不必要的连接器conf/server.xml是 Tomcat 的主配置。默认监听 8080如果被占用比如装了其他中间件启动会报Address already in use。改法!-- conf/server.xml 片段 -- Connector port8080 protocolHTTP/1.1 connectionTimeout20000 redirectPort8443 URIEncodingUTF-8 maxThreads200 minSpareThreads10 acceptCount100 /参数说明port是监听端口改成你要的URIEncodingUTF-8决定 GET 请求参数和 URL 路径的解码方式不设的话默认是 ISO-8859-1中文参数会乱码这是老版本最经典的坑之一maxThreads是最大工作线程数默认 200内网小系统够用高并发要结合压测调acceptCount是等待队列长度队列满了新连接直接被拒。connectionTimeout单位毫秒超时断开。另外server.xml里默认有一个 AJP 连接器8009 端口如果你不用 Apache HTTP Server 做前端转发可以注释掉少开一个端口少一份风险!-- 不用 AJP 就注释掉 Connector port8009 protocolAJP/1.3 redirectPort8443 / --3.2 内存参数和编码参数到底该写在哪很多人把内存参数写进catalina.bat这是不推荐的因为升级或替换脚本时会被覆盖。正确位置是setenv.bat前面已经给了写法。这里补充一个判断内存是否够用的方法启动后访问一个压力页面同时用jconsole或jvisualvm连上去看堆曲线。如果老年代持续上涨且 Full GC 后不回落就是内存泄漏加-Xmx只是拖延得去查代码。编码问题要分三层看第一层是 JVM 的file.encoding影响日志和文件读写第二层是 Connector 的URIEncoding影响 URL 解码第三层是应用自己的request.setCharacterEncoding和响应头Content-Type。三层里任何一层没对齐中文就会出问题。我一般会在setenv.bat里加-Dfile.encodingUTF-8Connector 加URIEncodingUTF-8应用层用过滤器统一设UTF-8三管齐下。3.3 用 startup.bat 启动并确认真的起来了配置改完双击bin\startup.bat或者在 cmd 里执行。注意不要直接关掉那个黑窗口关掉等于停服务。启动过程会新开一个窗口显示日志看最后有没有Server startup in xxx ms。# 在 cmd 里启动方便看输出 cd /d D:\server\tomcat7\bin startup.bat # 验证端口是否监听 netstat -ano | findstr :8080 # 验证 HTTP 是否响应 curl http://localhost:8080/如果netstat有输出但浏览器打不开先看 Windows 防火墙是不是拦了如果netstat没输出看启动窗口的报错。常见的是JAVA_HOME没配好报The JRE_HOME environment variable is not defined correctly。停止服务用shutdown.bat别直接叉掉窗口否则可能留下僵尸进程占着端口下次启动就报端口占用。4. 部署 war 包与 JSP 编译从放到跑通的完整链路4.1 war 包部署的两种方式和自动解压行为部署一个 war 最简单的方式是把它复制到webapps目录下。Tomcat 启动时会自动解压 war 成同名目录并部署。如果你的 war 叫myapp.war访问路径就是http://localhost:8080/myapp/。# 复制 war 到 webapps copy D:\build\myapp.war D:\server\tomcat7\webapps\ # 重启 Tomcat或等自动扫描但重启最稳 cd /d D:\server\tomcat7\bin shutdown.bat startup.bat逻辑说明Tomcat 默认的Host配置里autoDeploytrue、unpackWARstrue所以放进去会自动解压部署。但自动部署有延迟且热部署在老应用上容易出类加载器泄漏生产环境我一般关掉自动部署改成手动重启。关掉的方法是在server.xml的Host标签里设autoDeployfalse、unpackWARstrue。部署后如果访问 404先确认三件事war 是否真的解压出了目录、目录名和访问路径是否一致、webapps下有没有残留的同名旧目录。旧目录不删新 war 解压时可能合并出问题。4.2 用 manager 应用做可视化部署可选但好用Tomcat 自带一个manager应用可以在浏览器里上传 war、启动停止应用。默认它是被限制访问的需要配用户。改conf/tomcat-users.xml!-- conf/tomcat-users.xml -- tomcat-users role rolenamemanager-gui/ user usernameadmin password换成你的强密码 rolesmanager-gui/ /tomcat-users注意manager-gui角色只能从本机访问远程访问需要额外配context.xml的RemoteAddrValve但我不建议对公网开放 manager风险太高。配好后访问http://localhost:8080/manager/html输入账号密码即可看到部署界面。这个方式适合调试阶段频繁换包省去反复复制重启。4.3 JSP 编译报错怎么定位JSP 出问题报错信息往往很长但关键就几行。定位顺序是先看浏览器页面上的异常栈最底部根因通常在Caused by后面再去看logs目录下对应的日志文件。logs里localhost.yyyy-mm-dd.log是应用级日志catalina.yyyy-mm-dd.log是容器级日志。# 实时看日志Windows 没有 tail用 powershell powershell Get-Content D:\server\tomcat7\logs\catalina.out -Wait -Tail 50如果报Unable to compile class for JSP常见原因是 JDK 版本和 Tomcat 不匹配或者work目录里的旧编译产物冲突。解决停服务删work\Catalina整个目录重启。如果报The absolute uri ... cannot be resolved是 taglib 声明或 jar 缺失检查WEB-INF/lib里有没有对应的标签库 jar。5. 避坑与排查老版本 Tomcat 在 Windows 上的五个高频翻车点5.1 启动一闪而过窗口关了但服务没起来现象双击startup.bat黑窗口闪一下就没了浏览器访问不了。原因startup.bat本身只是调用catalina.bat start真正的启动日志在新开的窗口里如果新窗口因为配置错误秒退你就什么都看不到。解决不要双击在 cmd 里执行catalina.bat run这样日志直接打在當前窗口报错一目了然。最常见的报错是JAVA_HOME路径带引号或结尾多了反斜杠改成不带引号的纯路径即可。5.2 端口占用但找不到占用进程现象启动报Address already in use: JVM_Bind但任务管理器里看不到明显的 java 进程。原因可能是上一次没正常关闭留下的僵尸进程也可能是别的软件占了 8080。解决用netstat -ano | findstr :8080找到 PID再用tasklist | findstr PID确认是什么进程确认是残留的 java 后用taskkill /F /PID PID杀掉。注意别误杀系统进程。5.3 中文乱码改了 URIEncoding 还是乱现象GET 请求中文参数乱码POST 有时正常有时乱。原因乱码可能发生在三个环节——浏览器编码、Connector 解码、应用解码。只改URIEncoding只解决 URL 部分POST body 的解码由应用层控制。解决确认URIEncodingUTF-8已加且重启生效应用里加一个 CharacterEncodingFilter 强制request.setCharacterEncoding(UTF-8)和response.setCharacterEncoding(UTF-8)数据库连接串也带上characterEncodingutf8。三层都对齐才行。5.4 内存溢出加了 Xmx 还是 OOM现象运行一段时间后报java.lang.OutOfMemoryError: Java heap space或Metaspace。原因如果是 heap多半是应用有内存泄漏比如静态集合只增不减、连接没关如果是 Metaspace是动态生成类太多频繁热部署、大量 JSP 或反射。解决先用jmap -histo:live PID看什么对象最多定位到代码Metaspace 问题可以适当调大-XX:MaxMetaspaceSize但根治要减少热部署频率。加-Xmx只是给泄漏争取时间不是解决。5.5 改了配置不生效怀疑人生现象改了server.xml或web.xml重启后行为没变。原因一是改错了文件比如改了conf下的但应用用的是WEB-INF下的二是work或临时目录有缓存三是根本没重启成功旧进程还在。解决确认改的文件路径正确停服务后确认进程真的没了tasklist | findstr java删work目录再启动。养成改配置前先备份、改完看启动日志确认加载了新配置的习惯。6. 让 7.0.103 跑得更稳日志切割、连接池与一个验证习惯老版本 Tomcat 默认的日志策略比较粗放catalina.out会一直涨时间长了能把磁盘写满。Windows 下没有 logrotate我一般用两种办法一是配logging.properties里的FileHandler做按大小切割二是写一个计划任务定期归档。改conf/logging.properties# conf/logging.properties 关键行 # 限制单个日志文件大小和数量 1catalina.org.apache.juli.FileHandler.limit 10485760 1catalina.org.apache.juli.FileHandler.count 10 1catalina.org.apache.juli.FileHandler.formatter java.util.logging.SimpleFormatterlimit单位字节这里设 10MBcount是保留文件数超过就滚动覆盖。这样catalina日志不会无限增长。注意catalina.out是catalina.bat重定向产生的不受这个配置控制要单独处理可以在setenv.bat里把输出重定向到带日期的文件或者用外部工具切割。数据库连接池方面Tomcat 7 自带 DBCP在context.xml或应用的META-INF/context.xml里配Context Resource namejdbc/myDB authContainer typejavax.sql.DataSource maxTotal50 maxIdle10 minIdle5 maxWaitMillis10000 usernamedbuser passworddbpass driverClassNamecom.mysql.jdbc.Driver urljdbc:mysql://127.0.0.1:3306/mydb?useUnicodetrueamp;characterEncodingutf8/ /Context参数说明maxTotal是最大连接数别设太大数据库端也有连接上限maxWaitMillis是获取连接的最长等待时间超时抛异常设太小高峰期容易报错设太大请求会堆积minIdle保持最小空闲连接避免每次新建连接的开销。老项目里连接泄漏很常见配一个removeAbandonedtrue和removeAbandonedTimeout300能兜底回收被遗忘的连接但这是补救不是根治。最后说一个我自己的验证习惯每次改完配置或部署新包不要只看浏览器首页能不能打开要跑一遍「启动日志无 ERROR → 关键接口返回正确 → 日志里没有异常栈 → 内存曲线平稳」这四步。老版本 Tomcat 的很多问题不会在首页暴露而是藏在某个特定请求或运行几小时之后。我吃过亏曾经一个配置改完首页正常结果定时任务跑起来才发现连接池不够半夜报警。从那以后改完必看日志、必压一下关键路径。希望帮到你。本文还有配套的精品资源点击获取