简介:Apache Tomcat 9.0.117 Windows x64 稳定版,面向 Java Web 开发者与运维人员,适合中小型系统以及低并发访问场景下的 Web 应用部署与日常学习。压缩包共 647 个文件,整体大小仅 14.16MB,内容十分紧凑。除常见的前端页面文件外,还包含 Java 与 JSP 源码、编译后的 class 文件、依赖 jar 包、XML 配置、properties 属性文件,以及 Windows 下使用的 bat 启动脚本,能够完整体现 Tomcat 的目录结构、启动流程和组件协作方式。目前已有 86 人学习下载。借助这套资源,读者可以深入理解 Tomcat 9 对 Servlet 4.0、JSP 2.3、EL 3.0 与 WebSocket 1.1 等规范的支持,学习 server.xml、context.xml、web.xml 等核心配置的实际用途,并通过 maxThreads、minSpareThreads 等参数掌握线程池调整和性能优化方法,为后续便捷部署 Java Web 项目、排查运行异常打下坚实基础。 手头刚拿到一个apache-tomcat-9.0.117-windows-x64.zip,估摸着不少同行也在折腾这玩意儿。别急着解压就完事,这个压缩包背后牵扯到版本选择、Java环境匹配、目录权限、启动参数等一系列门道,搞不好分分钟让你在部署阶段原地裂开。这篇文章我就以实际折腾过的身份,把从下载到上线跑通中间的所有关键节点、常见坑位、调优思路一次讲透,保证你照着做就能少走弯路。
这包在 Windows x64 环境下给 Java Web 应用提供标准的 Servlet 容器服务,说白了就是你写好 Spring Boot、SSM 或者其他 Servlet 项目的 WAR 包,需要一个能把它跑起来的“运行底座”,Tomcat 就是干这个的。9.0.117 这个版本号属于 9.x 的较新维护分支,既兼容了主流生态,又在稳定性和安全补丁上有保障。适合谁看?刚入门要搭本地开发环境的,或者要在 Windows 服务器上快速部署测试环境的,再或者想换掉 8.5 老版本图个安心的——这篇对你都有用。
1. 下载前先搞懂这个包的基本盘
很多人看到一长串文件名就直接下一步了,但其实每段字符都在透露关键信息。先花 30 秒读懂它,后面每步操作都会更稳。
1.1 文件名里的隐藏信息
apache-tomcat-9.0.117-windows-x64.zip拆开就是三部分:
9.0.117:主版本 9,小版本 0,补丁版本 117。主版本 9 决定了它遵守 Servlet 4.0 规范,支持 Java EE 8 标准,这意味着大部分基于 Spring Boot 2.x / Spring 5.x 开发的 Web 应用可以直接塞进来跑,不用改代码。补丁版本 117 很关键,它修复了老版本积累的已知安全漏洞,比如拒绝服务、请求走私这类问题,用旧版本被扫出来漏洞的,升到这版就对了。
windows:编译时特意针对 Windows 系统做了一轮验证和适配。虽然 Tomcat 是纯 Java 写的,跨平台,但 Windows 版附带的启动脚本(
startup.bat、service.bat)用的批处理语法和路径分隔符,跟 Linux 的.sh完全是两码事。你硬拿 Linux 版的跑 Windows,不是不能跑,是脚本全废,纯给自己找罪受。x64:64 位架构版本。现在主流 Windows 机器基本都是 64 位处理器,配 64 位 JDK 就能把这个版本吃满。如果你是跑在 ARM 设备上的 Windows(比如某些轻薄本和平板),那这个包就不适用了,得去找 ARM 适配版,否则 JVM 直接罢工给你看。
另外还有一个容易被忽略的点:这里是.zip压缩包,不是.exe安装程序。这意味着 Tomcat 是绿色解压即用的,没有注册表残留,没有安装向导,删掉目录就等于卸载干净,对开发者来说这反而是个优点,部署环境迁移时直接把整个文件夹拷走就行。
1.2 为什么选 9.0.117 而不是 8.5 或 10.x
选版本这事,我的原则就一句话:除非你有硬性理由,否则不要追新,也不要无脑守旧。Tomcat 10 开始把包名从javax.*换成了jakarta.*,这玩意儿是核弹级变更,以前的老项目直接丢进去会报ClassNotFoundException: javax.servlet.ServletException,不重构代码根本跑不了。所以如果你的应用是基于 javax 生态的老项目,9.x 是稳妥选择。
那 8.5 和 9.0 怎么选?8.5 是 2016 年的老分支,官方虽然还在维护,但明显进入了存量期,新功能不再加,安全补丁也是按部就班。9.0 的维护活跃度高得多,补丁版本更新频率快,且兼容性几乎一致。对运维来说,更新活跃版本 = 安全风险更低,能选 9.0 就别抱 8.5 了。
还有个小细节,下载校验的时候看一下官方 SHA-512 校验和,Windows 终端跑一行certutil -hashfile apache-tomcat-9.0.117-windows-x64.zip SHA512来比对,万一是从非官方源下到被篡改的包,这一步能保命。
2. 安装前的环境准备与版本选型
Tomcat 本身是绿色软件,解压就能跑,但它依赖 Java 环境——就像汽车要加汽油一样,没有 JDK 或者版本不对,启动就是一片红。这个环节最常见的翻车点就是 JDK 版本和 Tomcat 版本不匹配。
2.1 JDK 版本怎么配才不出幺蛾子
Tomcat 9.0.117 官方要求的最低 Java 版本是 Java 8,推荐用 Java 11 或更高。但这个“推荐”是有讲究的,我实际踩过坑后总结如下:
| Tomcat 版本 | 最低 Java 版本 | 推荐 Java 版本 | 说明 |
|---|---|---|---|
| 9.0.x | Java 8 | Java 8 或 11(LTS) | 兼容最广,老项目闭眼选 |
| 10.1.x | Java 11 | Java 11 或 17 | 需要 jakarta 命名空间 |
| 11.0.x | Java 17 | Java 17 或 21 | 纯 jakarta + 新特性 |
建议直接装 JDK 11(比如 Eclipse Temurin 11 或 Oracle JDK 11),因为 Java 8 虽然稳定但确实步入维护尾声,JDK 17 甚至 21 虽然 Tomcat 也兼容,但有些老应用依赖的内置库可能在更高版本 JDK 上出现反射访问报错,中间的 11 是最稳的平衡点。
安装 JDK 的时候注意两点。第一,安装路径别带空格,比如别装到C:\Program Files\Java\jdk-11,因为后续设置CATALINA_HOME环境变量和脚本解析时,带空格的路径在某些场景下会莫名其妙报“不是内部或外部命令”。第二,装完 JDK 一定要配置JAVA_HOME环境变量,Tomcat 启动脚本就靠它找到 Java 可执行文件。配置方法我在下一节展开。
2.2 解压安装的正确姿势
下载完apache-tomcat-9.0.117-windows-x64.zip之后,别双击解压到默认位置就完事。我的习惯是建一个专门的部署目录,弄一个长这样:
D:\dev\server\apache-tomcat-9.0.117注意要求整个路径不含中文、不含空格,全英文小写(有些开发人员的 Windows 用户名本身就是中文,就很容易踩这个坑)。解压完成后的目录结构是这样的:
apache-tomcat-9.0.117/ ├── bin/ # 启动/关闭脚本、核心 jar ├── conf/ # 配置文件:server.xml、web.xml、context.xml ├── lib/ # Tomcat 运行依赖 jar ├── logs/ # 运行日志:catalina.out、localhost.log ├── temp/ # 临时文件目录 ├── webapps/ # 部署应用目录,WAR 丢这里就行 └── work/ # JSP 编译后缓存目录这里有个隐藏细节:解压工具的兼容性。Windows 自带资源管理器对 zip 解压是没问题的,但如果用了某些老版本的国产解压软件,可能在解压过程中丢符号链接或者改文件编码,导致启动时缺文件。我用 7-Zip 解压同样一个包从没出过问题,如果遇到诡异的报错,优先换 7-Zip 或 WinRAR 重新解压一次。
3. 配置 Tomcat 环境变量与核心文件
这一节是配置的重头戏,也是很多人容易忽略的“隐形门槛”。环境变量配置不当,会导致 Tomcat 无法找到 Java 或运行报错;核心文件不关注,则应用部署后可能遇到莫名其妙的端口冲突或编码问题。
3.1 环境变量配置实操
右键“此电脑” → 属性 → 高级系统设置 → 环境变量,新增:
- 变量名:
JAVA_HOME,变量值:你的 JDK 安装路径,比如C:\soft\jdk-11(注意不带\bin) - 变量名:
CATALINA_HOME,变量值:D:\dev\server\apache-tomcat-9.0.117 - 编辑
Path,新建一行,加%JAVA_HOME%\bin,也可以加%CATALINA_HOME%\bin(这样就能在任意终端里启动和关闭 Tomcat)
这里具体说明一下CATALINA_HOME和JAVA_HOME的区别:JAVA_HOME负责告诉电脑“Java 在哪”,Tomcat 本质是用 Java 语言写的程序,没有 Java 环境它自己根本无法启动;CATALINA_HOME则告诉 Tomcat“自己的家在哪”,尤其是在后续设置开机自启动服务的时候,这个变量缺了会让服务完全找不到 Tomcat 安装根目录。
配置完别急着用,有一个关键操作:关掉所有已经打开的命令行窗口再重新打开一个,因为环境变量只在新的终端会话里才重新读取生效,否则会一直读取到旧值,导致“明明设置了就是不起作用”的困扰。
在命令行窗口敲echo %JAVA_HOME%,再敲java -version,两个命令返回值正常,就说明 Java 环境已配置好。
3.2 核心配置文件速览:不用改但要知道
刚解压的 Tomcat 是可以直接启动的,默认配置不用改就能看到欢迎页。但如果你想深入掌握,至少要了解conf/server.xml这个核心文件,它是 Tomcat 的“命根子”:
- 端口配置:默认 HTTP 端口是
<Connector port="8080" protocol="HTTP/1.1" .../>。如果 8080 被其他程序抢占了,改这里成port="8081"就行。 - 关闭命令端口:默认是
<Server port="8005" shutdown="SHUTDOWN">,这是控制 Tomcat 关闭的端口,属于本地管理端口,建议别暴露到公网,否则别人能通过指定端口模拟关闭命令。 - AJP 端口:默认
<Connector port="8009" protocol="AJP/1.3" />,如果没在前置部署 nginx 并用 AJP 协议,这个端口可以注释掉或保持默认,不用纠结。
conf/web.xml里也藏着两个常用配置:listingEnabled(目录浏览开关)和session-timeout(会话超时时间,默认 30 分钟)。生产环境把listingEnabled改成false是个基本安全意识,免得别人直接通过 URL 浏览你的服务器目录结构。
另外一个很容易踩的坑是文件编码:Tomcat 8.5 开始默认 URI 编码已经是 UTF-8 了,但在 Windows 上如果出现中文文件名乱码,需要在server.xml的 Connector 上加上URIEncoding="UTF-8"属性;同时给 JVM 启动参数加-Dfile.encoding=UTF-8。这个在 9.0.117 上虽然默认值较为友好,但建议显式声明一遍,防止后续牵扯到系统区域语言设置导致诡异编码问题。
4. 启动服务与功能验证
环境变量配置好,就能执行启动操作。这一步我用过的两种启动方式最典型:手动脚本启动和注册 Windows 服务自启动。先从手动方式开始。
4.1 启动流程与验证命令
双击D:\dev\server\apache-tomcat-9.0.117\bin\startup.bat,屏幕上会弹出一个黑窗口滚动日志,如果最后一行是:
Server startup in [xxx] milliseconds就说明启动成功了。这时候黑窗口别关,那是 Tomcat 的控制台输出窗口——用这种控制台模式运行,关掉窗口就等同于强制关闭 Tomcat,有时候会导致数据没来得及写盘就断电,属于操作习惯上的一个大忌。
验证方式分三层:
- 本机验证:浏览器输入
http://localhost:8080,能看到 Tomcat 默认首页(左上角画着一只猫,里面写着 “If you're seeing this, you've successfully installed Tomcat. Congratulations!”),说明容器服务已就绪。 - 局域网验证:确认防火墙允许 8080 端口放行(添加入站规则),然后另一台机器用
http://主机IP:8080访问。如果访问不了,Windows 防火墙是最常见的拦截者。 - 进程验证:命令行输入
netstat -ano | findstr 8080,能看LISTENING状态和对应进程 PID,说明端口确实在监听,不是缓存页骗你。
停止服务就双击shutdown.bat或者新开命令行执行shutdown.sh(Windows 是shutdown.bat)。有个细节:关闭后等几秒再启动,避免旧进程还没完全释放端口,导致反复起停时报 “Port already in use”。
4.2 手动启动遇到打印输出但不成功的情况
这个坑我见得太多了。双击startup.bat后黑窗口唰唰刷了几行字,但最后没有显示Server startup in,而是立刻回到命令行提示符,看上去“好像跑完了”,实际后台进程并没有起来。
原因多半是:Tomcat 在启动过程中抛了异常,但因为脚本身份的问题,错误信息弹到了另一个默认为logs\catalina.*.log的文件里,没有在黑色窗口直接显示。这时候别傻等,直接打开logs目录看到catalina.2025-xx-xx.log,翻到最后几行。
最常见的两类启动失败原因:
JAVA_HOME环境变量指错了路径,日志会报Cannot find ...或者java.util.zip.ZipException: error in opening zip file。解决:检查JAVA_HOME的值是否含多余的斜杠、空格、引号。- 端口被占用,日志会报
java.net.BindException: Address already in use。解决:netstat -ano | findstr 8080找到 PID,再tasklist | findstr PID看是哪个进程占了,该杀就杀,或者改 Tomcat 端口。
5. 端到端部署一个 Java 应用
启动没问题,才算摸到 Tomcat 的门槛,真正的考验在“把应用放进去跑”。这里分两步走:部署 WAR 包、配置 JVM 参数。
5.1 部署 WAR 包与目录要求
Tomcat 部署最简单的方案:把一个.war文件(比如my-app.war)直接复制到webapps目录下,Tomcat 会自动检测到新文件并解压部署。几秒后日志里会多出Deploying web application archive [my-app.war]和Deployment of web application archive [my-app.war] has finished,表示发布完成。
但要注意几个细节:
- WAR 包命名 = 访问路径:
my-app.war会部署到http://localhost:8080/my-app/。要想访问根路径(http://localhost:8080/),需要把 WAR 改名为ROOT.war(注意大写)。这是个很实用的小技巧:很多团队交付的包不叫 ROOT,直接访问域名发现是毛坯页,问题就在这。 - 更新 WAR 记得先停服务还是自动覆盖:默认 Tomcat 在开发模式(conf/context.xml 里
autoDeploy="true")下会自动热部署新 WAR,但生产环境建议先shutdown.bat,再替换 WAR 包,再启动。直接覆盖如果遇到旧解压目录里的冗余 class,会造成“改了代码但行为没变”的幻觉。 - webapps 目录下的解压目录别手动删一半:半删除状态会导致应用管理界面报
FileNotFoundException。最稳妥的做法是针对部署的应用删除整个目录,再删去配对的 WAR 包,然后重启。
5.2 JVM 参数与生产环境调优
性能调优不是玄学,核心就改bin\catalina.bat(Windows 批处理版)里这一行:
set "JAVA_OPTS=-Xms512m -Xmx1024m -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m"参数含义:
-Xms:JVM 启动时分配的初始堆内存,设为 512m 是为了让 JVM 一上来就预留足够内存,避免频繁扩容。-Xmx:JVM 最大的堆内存,这是大坑高发区。如果服务器物理内存是 4G,把-Xmx设成 4G 甚至更大,操作系统跟 JVM 抢内存,最后导致频繁 GC 或者直接被系统杀掉。一般建议堆内存不超过物理内存的 50%-60%。-XX:MetaspaceSize:存放类元数据的初始空间。很多老项目跑着跑着就OutOfMemoryError: Metaspace,就是因为没显式调大。
为什么我推荐 512/1024 起步?本地开发跑 Spring Boot 项目,256m 初始堆基本能跑;但一旦接入数据库连接池、Redis 客户端、本地缓存,内存占用分分钟上 500m+。设成 512m 起步 + 1024m 上限,既不会一次性吃满机器,也能抗住常规压力。
另外两个调优参数常常被人忽视:
-Djava.awt.headless=true:避免服务端起图形界面相关组件时崩溃,尤其是不带显示器的 Windows Server。-Dspring.profiles.active=prod:如果你的应用是 Spring 系列,可以直接在 JVM 参数里指定激活环境,省得单独配application.properties。
改完catalina.bat必须重启 Tomcat 生效,JVM 参数是不能热加载的。
5.3 Windows 服务自启动设置
每次开服务器都手动双击startup.bat实在太原始了。日常开发无所谓,但正式环境一定要把 Tomcat 注册成 Windows 服务,开机自启、异常重启都好使。用 Tomcat 自带的service.bat就能搞定:
- 打开命令行(以管理员身份),进入
bin目录 - 执行:
service.bat install Tomcat9(把 Tomcat 注册为名为 Tomcat9 的 Windows 服务) - 打开“服务”管理器,找到 “Apache Tomcat 9.0 Tomcat9”,右侧点“启动”
这里对 Windows 服务的运作机制做点补充解释:它本质是把 Tomcat 的后台进程托管给 Windows,由服务管理器统一管控。跟你在命令行启动的区别就是:命令行启动的前台进程一旦关掉登录终端就会被终止,而服务方式不受登录会话影响,断电重启后也能自动拉起,这是生产环境起码的姿态。
把服务设为“自动(延迟启动)”更好:Windows 开机时先让网络、数据库这些依赖服务就绪,再拉起 Tomcat,减少启动期连接失败的警告。注册完服务后,启动 Tomcat 的方式就从startup.bat变成net start Tomcat9或services.msc里点“启动”。
5.4 亲手跑通一个全流程验证
按完整链路走一遍:
- 准备一个小 WAR 包(我有时直接用 Tomcat 自带的
examples接口测试)。 - 把它命名为
ROOT.war放进webapps目录,然后通过service.bat install装系统服务并启动。 - 浏览器访问
http://localhost:8080/,看到你的应用页面,说明全链路通。 - 用
tasklist | findstr java确认 JVM 进程存在,再看logs\catalina.<日期>.log的启动耗时和是否报异常。
这一步做完,整个部署工作就从“会跑”上升到“能上线”了。
6. 常见问题与排查技巧实录
最后这部分,我把自己和身边人实际踩过、排查过的坑整理成速查表,每一个问题都对应一个真实场景。
6.1 常见错误速查表
| 现象 | 根本原因 | 解决方案 |
|---|---|---|
| 双击 startup.bat 闪退 | JAVA_HOME 未配置或配置错误 | 打开 cmd 输 java -version,确认环境变量 |
| 启动后浏览器无法访问 | 端口被防火墙拦截 | 添加 8080 入站规则,或换端口 |
| localhost 能访问,局域网其他机器不行 | Windows 防火墙拦截 Java | 防火墙中放行 Java 进程或 8080 端口 |
| 部署 WAR 后访问报 404 | WAR 包没命名成 ROOT | 确认访问路径是否含包名 |
| 浏览器中文乱码 | 文件编码 / URI 编码不统一 | server.xml 加 URIEncoding="UTF-8" |
启动报ZipException: opening zip file | lib 目录下存在损坏/部分 jar | 用 7-Zip 重新解压完整包,替换 lib |
报java.lang.OutOfMemoryError: Metaspace | MetaspaceSize 设置过小 | 调大-XX:MaxMetaspaceSize |
| 停止后马上启动报端口被占用 | 上次进程未完全退出 | taskkill /F /PID 进程号后重启 |
| 页面打开极慢、CPU 100% | 堆内存太小引发频繁 GC | 调整-Xms-Xmx并检查应用本身 |
6.2 三个处理难度较大的易错点
第一个易错点是“路径带空格”问题。有人把 Tomcat 放在类似C:\Users\张三\Desktop\新建文件夹\xxx的位置,表面上启动没问题,但当后续做服务注册、maven 集成、Jenkins 自动化部署时,路径带空格和中文字符容易导致bat脚本解析错乱。最彻底的办法就是改目录放到纯英文且无空格路径,一劳永逸。
第二个易错点是“热部署和内存泄漏”。本地开发图省事直接覆盖 WAR 试运行,在多项目交叉场景下,旧 classloader 没有完全回收,就会出现OutOfMemoryError: Metaspace且反复出现。这个坑排查起来最恶心——监控里内存一直在涨,但代码看不到明显泄漏。解决思路是:不热部署,直接停服务替换再启,虽然重启要点时间,但稳定压倒一切。
第三个易错点是对JAVA_OPTS和CATALINA_OPTS的区分。JAVA_OPTS是给所有 Java 进程(包括停止脚本)的参数,而CATALINA_OPTS只作用于 Tomcat 主进程。如果只想调 Tomcat 的 JVM 参数,就写进CATALINA_OPTS而不是JAVA_OPTS,否则执行shutdown.bat时也会带上堆内存参数,虽然没多大影响,但代码洁癖的人最好区分开。另外,需要加-Dspring.profiles.active=prod这类应用级参数时,放进CATALINA_OPTS更干净。
再说一个很隐蔽但常见的坑:解压不完整导致的灵异现象。Tomcat 的webapps目录在首次解压时自带ROOT、docs、examples等几个默认应用,如果你用老旧的压缩软件解压,某些文件夹里的符号链接或空目录丢了,Tomcat 可能能启动,但访问默认首页总报错。处理办法很简单:删掉这几个自带的示范应用,只留ROOT,干净省心,还能减少被扫描到的攻击面。
最后,个人在实际操作中的一个习惯性建议:拿到这个 zip 包后,第一件事先把整个目录在 7-Zip 里重新解压一遍到纯净路径,然后立刻注册成 Windows 服务,再把webapps下面默认的docs、examples、manager、host-manager删掉。这一步能让你的 Tomcat 安装过程干净利落,也更接近生产环境。
根据我多次部署的经验,Tomcat 本身没有太大的技术难度,真正的复杂度全在环境匹配和细节习惯上。把 JDK 版本对应好、路径定得干净、端口不冲突、启动参数给够,后面整个运行过程就是静悄悄的稳定存在。要是你也在 Windows x64 上搭 Java Web 环境,按上面的流程走一遍,基本能在十分钟内把服务端跑起来,后面就是应用的活了。
本文还有配套的精品资源,点击获取