用于开启tomcat服务器的是bin目录下的启动脚本Windows环境执行startup.bat,Linux/Unix环境执行startup.sh,表面上是脚本在“开门”,真正把Java进程拉起来的,则是脚本内部调用的catalina命令和Bootstrap类。
Tomcat不是一个由系统托盘托管的常驻服务,它只是一个普通的Java程序,你下载解压后,bin目录里有一堆文件,其中startup.bat和startup.sh最像开关,双击startup.bat,或在Linux终端输入./startup.sh,就能让Tomcat开始监听8080端口(默认),但这个动作背后的运行链路,值得拆开看清楚。
开启Tomcat的核心机制:startup脚本与catalina命令的分工
启动过程像一条三层接力线,第一层是启动脚本,负责读取环境变量,找到JAVA_HOME,然后调起下一层,第二层是catalina.bat或catalina.sh,它们才是真正组装java命令的“调度员”,第三层是Bootstrap类,来自bin目录下的bootstrap.jar,它会加载类路径,初始化容器,最后打开HTTP连接器。
把这个机制用表格说明,会直观很多:
| 文件/命令 | 扮演的角色 | 典型调用方式 |
|---|---|---|
| startup.bat / startup.sh | 入口脚本,判断环境并调用catalina | 双击,或./startup.sh |
| catalina.bat / catalina.sh | 组装JVM参数、类路径,执行启动/停止 | catalina.sh run |
| org.apache.catalina.startup.Bootstrap | 主类,真正创建Server对象并启动 | 由java命令加载 |
行业共识认为,startup脚本更像是在“传话”,你完全可以用java -classpath ... org.apache.catalina.startup.Bootstrap直接启动Tomcat,不过日常没这个必要,脚本已经把常用参数都准备好了,不同版本的Tomcat对JDK版本有硬性要求,例如Tomcat 9需要Java 8及以上,Tomcat 10需要Java 11及以上,Tomcat 11需要Java 17及以上,JDK版本不匹配,脚本执行时经常会直接报错退出。
tomcat服务器怎么启动?先分清startup.sh和startup.bat
很多人做完项目,从Windows本地复制到Linux服务器后,第一反应是找startup.bat双击,结果当然没反应,因为Linux根本不认识.bat文件,这两个脚本功能相同,但完全不能跨平台使用。
Windows环境下的启动方式
Windows上启动Tomcat,多数情况下有三种做法:

- 双击startup.bat:最省事,但窗口会一直占着命令行,关掉窗口Tomcat就停了,适合本地开发测试。
- 在CMD中进入bin目录执行startup.bat:能看到完整的启动日志,方便定位错误。
- 注册成Windows服务:使用
service.bat install,把Tomcat变成后台服务,可以随系统开机自启,适合生产环境。
以命令行方式为例,具体操作路径是:
- 打开CMD,输入
cd D:apache-tomcat-9.0.xxbin,目录换成你本地的实际路径。 - 输入
startup.bat并回车。 - 看到“Server startup in [xxx] milliseconds”即表示启动成功。
这里有个小提醒:双击startup.bat时窗口一闪而过,多半是JAVA_HOME环境变量没设置,或者指向了错误的JDK路径,去“系统属性→环境变量”里检查JAVA_HOME,不要一上来就怀疑Tomcat出了问题。
Linux/Unix环境下的启动方式
Linux服务器上的Tomcat,通常通过SSH远程操作,步骤和Windows相似,但命令不同:
- 切换到Tomcat的bin目录:
cd /usr/local/tomcat/bin - 给脚本赋予执行权限:
chmod +x .sh - 执行启动:
./startup.sh
如果想让Tomcat在前台运行,日志直接打在屏幕上,可以用./catalina.sh run,这个命令不会立刻返回,而是把运行日志实时刷在控制台,日常生产环境中,更常见的做法是用./startup.sh后台启动,日志写入logs/catalina.out文件。
有些Linux发行版支持systemd,你可以额外写一个tomcat.service文件,把启动命令配置成/usr/local/tomcat/bin/startup.sh,之后就能用systemctl start tomcat来管理,这属于运维侧改造,Tomcat本身不提供这个功能。
linux系统tomcat启动命令有哪些
这一节单独聊Linux,因为服务器部署时,最多的疑问就是“命令敲了没反应”,linux系统tomcat启动命令其实不多,记住下面这组就足够应对日常运维。
| 命令 | 作用 | 使用场景 |
|---|---|---|
| ./startup.sh | 后台启动Tomcat | 日常启动 |
| ./catalina.sh run | 前台启动,日志直接刷屏 | 调试问题、看报错 |
| ./catalina.sh stop | 停止Tomcat进程 | 日常关闭 |
| systemctl start tomcat | 通过systemd服务启动 | 配置了开机自启时 |
启动后怎么确认真的成功了?
不要只凭“没报错”就判断启动成功,完整验证可以分三步:
- 运行
ps -ef | grep tomcat,确认存在java进程。 - 运行
tail -f /usr/local/tomcat/logs/catalina.out,看日志结尾有没有“Server startup in”。 - 在浏览器访问
http://服务器IP:8080,看是否能出现Tomcat默认主页。
如果访问不到,先检查系统防火墙有没有放行8080端口,再检查conf/server.xml中端口是否被人为修改过。
tomcat启动报错常见原因:从环境变量到端口占用
启动报错是开发者绕不开的经历,各类问题里,tomcat启动报错常见原因集中在几个固定方向。
JAVA_HOME未配置或配置错误
Tomcat是Java程序,启动第一件事就是找JAVA_HOME,如果你双击startup.bat后没反应,或执行./startup.sh时提示Neither the JAVA_HOME nor the JRE_HOME environment variable is defined,基本就是这个原因。
解决办法:
- Windows:把JDK安装路径配置为JAVA_HOME,例如
C:Program FilesJavajdk-17。 - Linux:在/etc/profile或~/.bashrc中加入
export JAVA_HOME=/usr/local/jdk,然后执行source /etc/profile让配置生效。
8080端口被占用
Tomcat默认监听8080,如果这个端口被其他进程占用,比如另起了一个Tomcat、Nginx,或某些开发工具把端口抢占了,启动时会报Port 8080 was already in use。
处理办法:
- 运行
netstat -ano | findstr 8080(Windows)或netstat -anp | grep 8080(Linux),找出占用进程的PID。 - 结束占用进程,或者修改Tomcat的conf/server.xml,把Connector端口改成8081等空闲端口。
启动脚本权限不对
Linux下提示Permission denied,说明startup.sh没有执行权限,很多压缩包解压后默认不带x权限,这是新手经常踩的坑,用chmod +x bin/.sh即可解决。
内存或JVM参数设置过高
catalina.sh会读取CATALINA_OPTS和JAVA_OPTS环境变量,如果配置了过大的堆内存,Xmx4g,而服务器物理内存不足,进程就会直接启动失败,适当调低参数,例如改成

-Xmx512m,再重新启动。
开启tomcat服务器的几个高权重操作细节
这些细节平时容易被忽略,但处理不好会浪费很多时间。
先看目录,再动手
Tomcat目录中,bin/提供脚本,conf/控制配置,logs/记录日志,webapps/放部署的应用,启动之前,首先确认webapps目录下有没有部署项目,否则就算Tomcat启动成功,访问你的应用还是会404。
停止时不要直接杀进程
很多人只知道startup.sh,忘了shutdown.sh或catalina.sh stop,停止Tomcat时不要直接kill -9 java,那会导致未保存的状态丢失,严重时端口驻留不释放,正规做法是执行./shutdown.sh,或者./catalina.sh stop。
日志永远是排错第一入口
启动过程中的任何异常,都会写入logs/catalina.out,报错信息里通常包含具体类名和错误行号,按提示调整即可,实在看不懂时,把第一句ERROR复制到搜索引擎,比反复重启效率高得多。
Q&A:开启tomcat服务器常见问题
问题1:tomcat服务器怎么启动后一闪而过?
答:最常见原因是JAVA_HOME没配好,导致startup.bat找不到java命令,建议在CMD里手动进入bin目录执行startup.bat,此时错误信息会留在当前窗口,不再一闪而过,根据提示补齐环境变量,然后再试。
问题2:startup.sh和startup.bat能混用吗?
答:不能,Windows的批处理语法和Linux的Shell语法互不兼容,在Windows上只能运行startup.bat,在Linux上只能运行startup.sh,远程连接Linux服务器时,输入的是./startup.sh,不是.startup.bat。
问题3:开启Tomcat后浏览器访问不了,但日志显示启动成功,怎么办?
答:先确认访问地址用的是http://localhost:8080还是http://你的IP:8080,如果是远程访问,检查服务器防火墙是否放行8080端口,再确认conf/server.xml中Tomcat的address没有被绑定到127.0.0.1,这些都没问题后,再查看webapps中是否部署了可访问的应用。
Tomcat的启动机制并不复杂,记住startup脚本、catalina命令、JAVA_HOME三条主线,绝大多数启动问题都能自己排查。
图片来源于AI模型,如侵权请联系管理员。作者:酷小编,如若转载,请注明出处:https://www.kufanyun.com/ask/901925.html

