☰
Tomcat 9.0.45 Windows下载安装与配置实战指南
2026/10/22 4:21:25 网站建设 项目流程

简介:Tomcat 9.0.45 的 Windows 64 位发行包,面向 Java Web 开发者、运维人员,以及需要在 Windows 上搭建 Servlet 和 JSP 运行环境的学习者,可帮助快速获得稳定的服务器版本,免去在官网反复核对下载链接的麻烦。压缩包共含 642 个文件,包括帮助文档、类文件、源码、页面示例、依赖库、配置文件以及启动脚本等类型,整体约 12.68MB,轻量且完整。目前已有 768 人学习浏览,适合刚开始接触 Tomcat 的读者用来理解默认目录结构和配置方式,也便于开发者在本地验证部署逻辑。包内脚本覆盖服务的启动与关闭,配置示例涉及连接器、端口等常见设置;大量页面示例和源码片段,既可以辅助观察运行效果,也能作为阅读和二次开发的素材。可以说,这份打包既保留了官方发行版的完整性,又为日常学习和问题排查提供了实用的参照。

1. 为什么值得把 apache-tomcat-9.0.45-windows-x64 下载下来跑一遍

Tomcat 9.0.45 不是最新版,但在 Windows 本地开发环境里依然是“稳”的代名词。很多 Java Web 项目的编译依赖、教程示例甚至测试脚本都锁定了 9.0.45 这个版本,直接拿 windows-x64 的发行包解压就能跑,省掉了自己编译源码的麻烦。这份资源解决的是从零到能跑通一个 Web 应用的全过程,涉及 JDK 配置、启动脚本、端口调整、内存优化和服务注册,一条链路全部覆盖。适合刚接触 Java Web 的开发者,也适合想快速搭一套本地 Tomcat 环境的测试或运维人员。只要按下面步骤操作,十几分钟就能看到 Tomcat 默认首页。

2. 解压与首次启动:把 Tomcat 从压缩包变成运行中的服务

2.1 安装前准备:JDK 版本与 JAVA_HOME 怎么配

Tomcat 9.0.45 基于 javax.* 命名空间实现 Servlet 4.0 规范,官方要求 Java 8 及以上版本,实际支持 JDK 8、11、17。从项目兼容性角度看,存量项目里 JDK 8 与 11 占大多数,新开项目也有不少直接用 17 的。建议根据项目自身的编译版本决定,不要盲目上新版 JDK,否则后面排坑时容易混淆是 Tomcat 的问题还是 JDK 的问题。

系统里先确认 java 命令是否可用,打开 cmd 执行:

java -version

如果提示不是内部或外部命令,说明 JAVA_HOME 没配好或 JDK 没装。安装 JDK 之后,配置环境变量:

set JAVA_HOME=C:\Program Files\Java\jdk1.8.0_251 set PATH=%JAVA_HOME%\bin;%PATH%

注意 JAVA_HOME 必须指向 JDK 根目录,例如C:\Program Files\Java\jdk1.8.0_251,不要带上 bin 子目录。%JAVA_HOME%\bin追加到 Path 后,java 命令在所有 cmd 窗口都能直接找到。

Tomcat 启动时,bin 目录下的 setclasspath.bat 会优先读取 JAVA_HOME,其次才读取 JRE_HOME。两个变量都没有时启动脚本直接报错退出。这里有个常见误解是只装 JRE 就能跑 Tomcat,实际纯 JRE 环境下很多功能受限,比如 JSP 预编译和部分管理功能,所以建议统一用 JDK。

另外,解压路径尽量不要带空格和中文。虽然 Tomcat 官方支持带空格路径,但 Windows 服务注册和外部脚本拼接路径时容易出问题。我一般固定放在C:\tomcat9这种目录,后面省很多事。

2.2 目录与 bin 脚本:下载包里每项是干什么的

将 apache-tomcat-9.0.45-windows-x64.zip 解压后,会得到这些目录:

  • conf:核心配置文件,server.xml、web.xml、context.xml、tomcat-users.xml 都在这里
  • bin:Windows 启动与服务脚本,也就是大家最常用的 bat 文件
  • lib:Tomcat 与 Web 应用共享的 jar 包
  • logs:运行日志和访问日志
  • webapps:应用部署目录,默认带有 manager、docs 等应用
  • work:JSP 编译生成的临时 class 文件
  • temp:运行过程中的临时文件

bin 目录下的脚本值得逐个过一遍:

脚本作用常见使用场景
startup.bat启动 Tomcat日常开发启动
shutdown.bat停止 Tomcat日常开发停止
catalina.bat核心脚本,分发 start/stop/run/configtest 等动作后端操作与排障
setclasspath.bat加载 JAVA_HOME/JRE_HOME 与 classpath启动时自动调用
configtest.bat校验 server.xml 等配置语法修改配置后验证
service.bat注册/卸载 Windows 服务服务模式部署
tool-wrapper.bat调用 Tomcat Native 库,启用 APR 相关功能APR 连接器场景
makebase.bat基于现有版本创建新实例目录多实例隔离
version.bat打印 Tomcat 与 JVM 版本信息环境基线确认
digest.bat生成用户密码摘要tomcat-users.xml 口令配置
ciphers.bat查看 JDK 支持的 SSL/TLS 密码套件HTTPS 配置

初学阶段不用全背下来,记住 startup.bat、shutdown.bat、service.bat 和 configtest.bat 这 4 个就足够应付日常操作。

2.3 第一次启动:startup.bat 跑起来并验证默认页

进入解压目录的 bin 子目录,打开 cmd 执行:

cd C:\tomcat9\bin startup.bat

正常会弹出新的黑色窗口,最后出现Tomcat started.字样。浏览器访问http://localhost:8080,能看到默认首页说明安装成功。

如果 startup.bat 窗口闪退,说明脚本执行时报错退出了,常见原因是 JAVA_HOME 没配置,先回到 2.1 把环境变量补上。临时应急也可以在当前 cmd 窗口手动设置变量后再启动:

set JAVA_HOME=C:\Program Files\Java\jdk1.8.0_251 startup.bat

这个临时设置只对当前窗口有效,不影响系统配置,适合快速排障。如果改完还闪退,打开 logs 目录下 catalina.yyyy-MM-dd.log,从最后几行看具体异常原因。

首次启动后建议顺手执行一次 version.bat:

C:\tomcat9\bin\version.bat

这个命令会输出 Server version、JVM 版本和 Java Home 路径,把输出和业务项目要求对比一下,能提前发现 JDK 版本不匹配的问题。我每次搭完 Tomcat 都会先跑一次 version.bat 留底,后面部署应用时出问题对照这个信息能少走很多弯路。

提示:路径里尽量不要放空格和中文。Windows 下 Tomcat 对空格兼容性尚可,但很多外部脚本拼接路径时还是会翻车。

3. 参数调整:端口、内存与配置校验都要到位

3.1 修改 HTTP 端口:server.xml 里的 Connector 改哪里

默认端口 8080 经常与本机其他服务冲突,尤其是开发机同时跑多个 Java 进程时。修改端口要打开 conf 目录下的 server.xml,定位到 Service 模块里的 Connector 节点:

<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />

把 port 改成 8090 或 8081,同时留意后面的 redirectPort。这个参数是 HTTP 请求被转发到 HTTPS 时的目标端口,默认 8443,修改时一般不动。改完直接执行 configtest.bat 验证语法,再重启 Tomcat 生效。

开发阶段不建议把 HTTP 端口和 redirectPort 改成一模一样,因为 redirectPort 指向的是另一个 Connector,保持默认即可。另外 server.xml 里还有一处<Server port="8005" shutdown="SHUTDOWN">,这是管理用的关闭端口,实际项目中经常被忽略。安全要求高的话建议修改这个端口和 shutdown 口令,或者直接禁用——外部如果能访问到 8005 端口,理论上可以通过发送 SHUTDOWN 字符串关停服务。

3.2 内存设置:用 setenv.bat 避免每次升级都改 catalina.bat

JVM 内存参数是 Tomcat 日常最常动的配置。新手容易直接改 catalina.bat 里的 JAVA_OPTS,这是最不推荐的做法——Tomcat 升级或重新解压后改动就丢了,而且不同脚本对 JAVA_OPTS 的继承行为有细微差别。

正确做法是在 bin 目录下新建 setenv.bat,Tomcat 启动时会自动加载它。内容如下:

:: 设置 Tomcat 独立运行参数,不影响其他 Java 程序 set "CATALINA_OPTS=-Xms512m -Xmx1024m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=256m"

解释几个参数的含义:Xms 是初始堆大小,Xmx 是最大堆大小,MetaspaceSize 和 MaxMetaspaceSize 分别对应元空间的初始值与上限。Tomcat 9 在 JDK 8 及以上版本里已经用 Metaspace 替换了旧版的 PermGen,不要再写-XX:PermSize这类参数,写了会报 Unrecognized JVM option。

实际选值要看业务场景:只跑一个简单管理后台,384m 到 512m 就够;同时部署多个 Web 应用,建议 1024m 起步;如果机器内存紧张,Xms 和 Xmx 设成相同值可以避免动态扩容带来的性能抖动。

把内存参数放到 CATALINA_OPTS 而不是 JAVA_OPTS,原因在于后者还可能被其他 Java 工具调用,影响面太大。CATALINA_OPTS 只在 Tomcat 启动时生效,不影响系统里的其他 Java 进程。

3.3 配置完成后校验:configtest.bat 到底能查出什么

每次修改 server.xml、web.xml 或 context.xml 后,重启前先跑一遍:

C:\tomcat9\bin\configtest.bat

输出末尾看到Server version信息且没有明确报错,说明本次 XML 改动在语法层面没有问题。这里要强调一下,configtest.bat 只校验 XML 文件格式和 Tomcat 部分配置的合法性,不验证 Web 应用本身的逻辑。它查不出 jar 包缺失和类冲突,这两类问题还是要靠 catalina 日志定位。

我的习惯是改任何配置文件都先跑一次 configtest.bat,再启动;如果启动失败再回头看 logs 目录,不要反复修改重启瞎试。配置文件本身不复杂,但错误往往发生在 Connector 参数、字符集配置和解压目录权限的组合之间。

4. 注册 Windows 服务:让 Tomcat 开机自启且不占命令行窗口

4.1 为什么建议注册服务,服务模式与命令行模式的差异

用 startup.bat 方式跑 Tomcat 时,Tomcat 进程依附于当前用户的 cmd 窗口,关掉窗口服务就停了,这在日常开发环境能忍受,但在演示或临时测试环境非常尴尬。注册成 Windows 服务后,Tomcat 以系统服务方式独立运行,开机自启、后台常驻,用户主动登出也不受影响。服务模式还有一个好处是可以用服务管理控制台统一启停,不用到处找脚本窗口。

Windows 版 Tomcat 的服务注册原理是:bin 目录下的 Tomcat9.exe 作为服务代理,Tomcat9w.exe 作为可视化配置工具,service.bat 负责注册和卸载动作,三者配合,把 Java 进程包装成符合 Windows 服务框架的执行单元。zip 版本没有安装向导,所以必须手动执行 service.bat 注册,这也是很多人下载 zip 包后觉得“不好用”的原因——不是不能用,是少了这一步。

4.2 注册与卸载:service.bat install 与 remove

以管理员身份打开 cmd,进入 bin 目录:

:: 以管理员身份执行,注册默认服务名 Tomcat9 cd C:\tomcat9\bin service.bat install

输出显示The service 'Tomcat9' has been installed.说明服务注册成功。默认服务名为 Tomcat9,注册后可以在系统服务管理里看到一项 Apache Tomcat 9.0 相关的服务项。

启动服务有两种方式:

:: 通过命令行启动服务 net start Tomcat9

或者在服务管理界面里右键启动。启动后浏览器访问 http://localhost:8080 验证是否真的起来了。如果要卸载,先停止服务再执行:

:: 先停止,再移除服务 net stop Tomcat9 service.bat remove

卸载命令同样需要管理员权限。注意,如果安装时给 JAVA_HOME 配了环境变量,服务内部会读取系统路径;如果通过系统变量修改了 JDK 版本,建议先移除服务再重新安装,否则服务使用的可能还是旧路径。

4.3 服务参数调整:内存、启动类型与常用配置

服务注册后,默认内存和命令行启动时保持一致,但如果想单独调服务模式下的内存,需要打开 Tomcat9w.exe 的可视化界面:

:: //ES 表示编辑服务配置 C:\tomcat9\bin\Tomcat9w.exe //ES//Tomcat9

界面里有一个 Java 选项卡,可以设置初始内存池大小和最大内存池大小,分别对应 -Xms 和 -Xmx。这里要注意,服务模式下 JVM 参数不像 setenv.bat 那样自动生效,Tomcat9w.exe 里的配置会覆盖 setenv.bat 的部分参数,所以不要两边各设一遍,容易混淆。

启动类型在系统服务管理界面里设置。右键服务属性,把启动类型改为“自动”,即可开机自启。如果希望服务以特定账户运行而不是本地系统账户,可以在“登录”选项卡里指定账户,但需要确保该账户有日志目录的写权限,否则 Tomcat 启动会报访问拒绝。

服务模式下 Tomcat 的日志还是会写到 logs 目录,只是不再有控制台输出。排障时直接看 logs/catalina.日期.log,Windows 服务模式下往往比命令行模式更依赖日志定位问题,因为很多错误根本不会在界面上弹出来。

5. 避坑:Tomcat 9.0.45 在 Windows 上常见的 5 个翻车现场

5.1 startup.bat 一闪而过,消息来不及看

现象:双击 startup.bat,黑色窗口弹出来又立刻消失,没有任何可读输出。

原因:JAVA_HOME 没设置,日志只有一行Neither the JAVA_HOME nor the JRE_HOME environment variable is defined,脚本找不到 Java 环境直接退出,窗口随之关闭。

解决:先打开 cmd,手动执行startup.bat,让报错页面停住并复制错误内容;再把 JAVA_HOME 配置到系统环境变量,重新启动验证。另外检查 catalina.bat 文件本身有没有被损坏,Windows 下应保持 CRLF 换行,不要被某些编辑工具改成 LF,改了这个脚本会直接无法解析。

5.2 端口被占:8080 被别的服务抢走

现象:启动时报Address already in use: JVM_Bind <null>:8080,或者默认页打不开,日志里出现 Connector failed to start。

原因:本机其他 Java 服务或开发工具占用了 8080 端口。

解决有两个思路。要么清理端口占用:

:: 查看 8080 端口对应的进程 PID netstat -ano | findstr :8080 :: 强制结束指定 PID 进程,PID 替换为上一行最后一列的值 taskkill /F /PID 12345

这里的 12345 是 netstat 输出里最后一列的 PID,要替换成实际值。要么干脆换端口,改 server.xml 里的 Connector 端口,改完 configtest.bat 验证再重启。两者选哪个取决于冲突是否固定:临时冲突建议清理,固定冲突建议直接换掉 8080。

5.3 内存不足:OutOfMemoryError 反复出现

现象:运行几天后 Tomcat 频繁卡死,日志出现java.lang.OutOfMemoryError: Java heap space或Metaspace。

原因:业务负载超过 Xmx 设置值,或部署的应用数量太多导致元空间增长超限。

解决:先统计实际内存用量,再调整 Xmx 和 MaxMetaspaceSize。Xmx 不要超过机器物理内存的一半,同时确保系统有足够剩余内存给开发工具和其他进程。对于长期运行的服务器,Xms 和 Xmx 设为相同值可以避免频繁扩容。调整后观察 catalina 日志里的 GC 情况,配合 JDK 自带工具核实是否还会继续增长。

5.4 权限不足:部署 war 包后应用访问 404

现象:webapps 下放了 war 包,Tomcat 也启动了,但应用访问 404,日志出现Access is denied或Unable to create directory。

原因:Tomcat 解压目录被放在了 Program Files 这类受保护目录,或者当前用户对 logs、webapps 没有写权限。

解决:把整个 Tomcat 目录移动到普通磁盘路径,例如C:\tomcat9,确保登录用户对该目录有完全控制权限。服务模式下还要检查服务账号的权限,必要时给 logs 和 webapps 目录单独授权。别小看这个问题,很多人栽在“本机跑得好好的,一部署到服务器就白屏”上,原因就在目录权限。

5.5 项目 API 不匹配:javax 与 jakarta 问题

现象:启动日志中报NoClassDefFoundError: javax/servlet/...,或者部署后类无法加载。

原因:Tomcat 9.0.45 仍是 Servlet 4.0 规范,接口使用 javax.* 命名空间。如果项目是用 Tomcat 10 及以上版本的 jakarta.* 命名空间开发的,直接在 Tomcat 9 上跑必然报类缺失。

解决:确认项目的javax.servlet-api依赖版本,或把项目接口包名从 jakarta.* 批量替换回 javax.* 后再部署。如果新项目原生使用 jakarta.*,建议直接选择 Tomcat 10 及以上版本,不要在 9.0.45 上强行兼容,省下的时间比改代码的成本大得多。

6. 验证流程与顺手的小工具:给 Tomcat 装一道稳定阀

部署阶段用 version.bat 确认基线,改动配置后用 configtest.bat 验证语法,这是最基本的组合。bin 目录里还有两个容易被忽视的脚本:digest.bat 和 ciphers.bat。

digest.bat 用来生成密码摘要,给 tomcat-users.xml 配置用户时不写明文密码:

:: 使用 md5 摘要算法生成 admin 密码的摘要 C:\tomcat9\bin\digest.bat -a md5 admin

把输出的摘要值填到<user password='...'>里,这样即便配置文件被人看到也不会泄露明文密码。ciphers.bat 会在启用 HTTPS 后帮你列出当前 JDK 支持的全部 SSL/TLS 密码套件:

:: 列出可用密码套件 C:\tomcat9\bin\ciphers.bat

在 server.xml 的 Connector 里配置ciphers=参数时,用这个命令核对可用套件,避免填了 JDK 不支持的套件导致 TLS 握手失败。

如果要做多实例隔离,makebase.bat 可以直接基于当前版本创建一套新的目录结构:

:: 基于当前版本创建新实例目录,用于多实例隔离 C:\tomcat9\bin\makebase.bat C:\tomcat9-instance2

生成的新目录包含 bin、conf、logs、webapps 等完整结构,每个实例独立监听不同端口,适合做测试环境与正式环境隔离。

验证一台 Tomcat 能不能真正对外提供服务,最直接的办法是部署一个简单的 war 包。把任意已有 war 文件复制到 webapps 目录,几秒后 Tomcat 会自动解压。观察 logs 目录新增日志,确认没有报错后,浏览器访问 http://localhost:8080/应用名/。能打开页面说明连接器、部署目录和应用容器三个层都是通的,这比只访问默认首页更接近真实业务场景。

从那以后我每次改动 Tomcat 配置,都强制先跑一遍 version.bat 留底,再执行 configtest.bat 校验,最后翻 catalina 日志确认没有 WARNING 再重启。配合 digest.bat 处理口令、ciphers.bat 核对加密套件,这套流程帮我避开了很多低级配置事故。希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询