在 macOS 系统中通过命令行启动 Tomcat 服务器是开发和运维过程中常见的操作,尤其适合需要自动化部署或远程管理服务器的场景,本文将详细介绍从环境准备到命令行启动 Tomcat 的完整流程,包括常见问题处理和优化建议,帮助用户高效完成 Tomcat 服务的配置与管理。

环境准备:安装 Java 和 Tomcat
在启动 Tomcat 之前,需确保系统已安装 Java 运行环境(JRE)和 Tomcat 服务器,macOS 通常自带 OpenJDK,但建议手动安装最新版本的 LTS(长期支持)版 Java 以确保兼容性。
安装 Java
通过 Homebrew 安装 OpenJDK(推荐方式):
brew install openjdk@17
安装完成后,配置环境变量,打开终端,编辑 ~/.zshrc(若使用 Zsh shell)或 ~/.bash_profile(若使用 Bash shell):
echo 'export JAVA_HOME=/usr/local/opt/openjdk@17' >> ~/.zshrc echo 'export PATH=$JAVA_HOME/bin:$PATH' >> ~/.zshrc source ~/.zshrc
验证 Java 安装:

java -version
若输出 Java 版本信息,则表示安装成功。
下载并解压 Tomcat
从 Apache 官网(https://tomcat.apache.org/)下载适用于 macOS 的 Tomcat 压缩包(如 apache-tomcat-9.0.82.tar.gz),并将其解压到指定目录(如 /usr/local/):
cd /usr/local tar -zxzf ~/Downloads/apache-tomcat-9.0.82.tar.gz mv apache-tomcat-9.0.82 tomcat9
为方便管理,可设置 Tomcat 环境变量:
echo 'export CATALINA_HOME=/usr/local/tomcat9' >> ~/.zshrc echo 'export PATH=$CATALINA_HOME/bin:$PATH' >> ~/.zshrc source ~/.zshrc
命令行启动 Tomcat 的核心步骤
Tomcat 的启动脚本位于 $CATALINA_HOME/bin 目录,startup.sh 用于启动服务,shutdown.sh 用于停止服务,以下是详细操作流程:

赋予执行权限
首次使用时,需为 Tomcat 的脚本文件添加可执行权限:
chmod +x $CATALINA_HOME/bin/*.sh
启动 Tomcat
执行 startup.sh 脚本:
$CATALINA_HOME/bin/startup.sh
若启动成功,终端会输出类似以下信息:
Using CATALINA_BASE: /usr/local/tomcat9
Using CATALINA_HOME: /usr/local/tomcat9
Using CATALINA_TMPDIR: /usr/local/tomcat9/temp
Using JRE_HOME: /usr/local/opt/openjdk@17
Using CLASSPATH: /usr/local/tomcat9/bin/bootstrap.jar:/usr/local/tomcat9/bin/tomcat-juli.jar
Tomcat started.
验证服务状态
Tomcat 默认监听 8080 端口,可通过以下方式验证服务是否运行:
- 方式1:检查端口占用
lsof -i :8080
若输出包含
java进程,则表示 Tomcat 正在运行。 - 方式2:访问 Web 页面
在浏览器中输入
http://localhost:8080,若显示 Tomcat 欢迎页面,则启动成功。
停止 Tomcat
执行 shutdown.sh 脚本:
$CATALINA_HOME/bin/shutdown.sh
停止后,再次执行 lsof -i :8080 应无输出。
常见启动问题及解决方案
在命令行启动 Tomcat 时,可能会遇到以下问题,以下是具体排查方法:
| 问题现象 | 可能原因 | 解决方案 |
|---|---|---|
启动时报错 Neither the JAVA_HOME nor the JRE_HOME environment variable is defined |
Java 环境变量未正确配置 | 检查 JAVA_HOME 是否指向 JDK 安装目录,可通过 echo $JAVA_HOME 验证;若未设置,参考本文“环境准备”部分重新配置。 |
端口冲突(Address already in use: bind) |
8080 端口被其他进程占用 | 执行 lsof -i :8080 查占用进程,使用 kill -9 <PID> 终止进程;或修改 Tomcat 端口(编辑 $CATALINA_HOME/conf/server.xml,将 <Connector port="8080" 改为其他端口)。 |
| 启动后无法访问页面 | 防火墙拦截或 Tomcat 未正确绑定地址 | 检查系统防火墙设置(如 System Preferences > Security & Privacy > Firewall);确保 server.xml 中 address 属性为 0.0.0(允许所有 IP 访问)。 |
日志报错 Failed configure endpoint |
JVM 内存不足 | 调整 JVM 内存参数,编辑 $CATALINA_HOME/bin/setenv.sh(若文件不存在则新建),添加以下内容:export JAVA_OPTS="-Xms512m -Xmx1024m"(设置初始堆内存 512MB,最大堆内存 1GB)。 |
进阶配置:优化命令行启动
自定义 JVM 参数
在 $CATALINA_HOME/bin/setenv.sh 中配置 JVM 参数,如内存大小、垃圾回收策略等:
#!/bin/bash export JAVA_OPTS="-Xms512m -Xmx1024m -XX:+UseG1GC -XX:MaxGCPauseMillis=200"
重启 Tomcat 后,新参数生效。
后台启动与日志管理
若希望 Tomcat 在后台运行并记录日志,可使用 nohup 命令:
nohup $CATALINA_HOME/bin/startup.sh > $CATALINA_HOME/logs/startup.log 2>&1 &
nohup:使进程在终端关闭后继续运行。> startup.log:将标准输出重定向到日志文件。2>&1:将错误输出也重定向到同一文件。
查看日志:
tail -f $CATALINA_HOME/logs/catalina.out
通过 systemd 管理服务(适用于 macOS 10.14+)
虽然 macOS 默认使用 launchd,但可通过创建 plist 文件实现类似 systemd 的管理:
- 创建服务文件:
sudo nano /Library/LaunchDaemons/org.apache.tomcat.plist
- 添加以下内容(根据实际路径修改
CATALINA_HOME):<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>Label</key> <string>org.apache.tomcat</string> <key>ProgramArguments</key> <array> <string>/usr/local/tomcat9/bin/startup.sh</string> </array> <key>RunAtLoad</key> <true/> <key>KeepAlive</key> <true/> </dict> </plist> - 加载并启动服务:
sudo launchctl load /Library/LaunchDaemons/org.apache.tomcat.plist sudo launchctl start org.apache.tomcat
相关问答 FAQs
问题1:如何在 macOS 中通过命令行查看 Tomcat 的实时日志?
解答:Tomcat 的实时日志位于 $CATALINA_HOME/logs/catalina.out,可通过 tail 命令实时查看日志内容,
tail -f $CATALINA_HOME/logs/catalina.out
若需查看特定时间段的日志,可结合 grep 过滤关键字,
grep "ERROR" $CATALINA_HOME/logs/catalina.out
问题2:修改 Tomcat 端口后,如何确保命令行启动时使用新端口?
解答:Tomcat 的端口配置文件为 $CATALINA_HOME/conf/server.xml,找到 <Connector> 标签中的 port 属性,将其修改为目标端口(如 8081):
<Connector port="8081" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
保存后,执行 shutdown.sh 停止旧服务,再通过 startup.sh 重新启动即可,启动后可通过 lsof -i :8081 验证新端口是否生效。
