CentOS7无Tomcat部署SpringBoot jar包脚本
把 jar 直接跑在系统上,比套一层 Tomcat 省事得多。CentOS7 自带 systemd,写个 service 文件就能开机自启、崩溃自启,日志走 journalctl,一条命令看全量。下面这份脚本,从创建用户到防火墙放行,一条链打通,复制粘贴就能用。

一、准备运行用户
root 跑 jar 是大忌,先给应用单独建用户,没登录 shell,想删就删。
groupadd -r app
useradd -r -g app -s /sbin/nologin -d /opt/app -m app

二、上传 jar 并定目录
统一丢到 /opt/app,改名不带版本号,方便脚本里写死路径。
mv demo-0.0.1-SNAPSHOT.jar /opt/app/app.jar
chown app:app /opt/app/app.jar
chmod 500 /opt/app/app.jar
三、最小化 JVM 参数
1 核 2 G 的云主机够跑大多数接口,先给 512 M,后期压测再调。
JAVA_OPTS="-Xms512m -Xmx512m -XX:+UseG1GC -XX:+UseStringDeduplication"
四、systemd 服务文件
路径固定 /etc/systemd/system/app.service,内容如下,**注意 ExecStart 里 jar 路径要写全**。
[Unit]
Description=SpringBoot App
After=network.target
[Service]
Type=simple
User=app
Group=app
WorkingDirectory=/opt/app
ExecStart=/usr/bin/java $JAVA_OPTS -jar /opt/app/app.jar
SuccessExitStatus=143
Restart=on-failure
RestartSec=10
[Install]
WantedBy=multi-user.target
写完 reload 一下让 systemd 识别:
systemctl daemon-reload
五、防火墙只开必要端口
默认 8080,改端口在 application.properties 里加 server.port=新端口。
firewall-cmd --permanent --add-port=8080/tcp
firewall-cmd --reload
六、启停命令合集
一条启动:
systemctl start app
看实时日志:
journalctl -u app -f
开机自启:
systemctl enable app
七、平滑升级脚本
上传新 jar 后,三秒完成热替换。
#!/bin/bash
set -e
cp /opt/app/app.jar /opt/app/app.jar.bak
mv /tmp/new-app.jar /opt/app/app.jar
chown app:app /opt/app/app.jar
systemctl restart app
老版本回滚:
mv /opt/app/app.jar.bak /opt/app/app.jar
systemctl restart app
八、常见坑速查
- **端口被占用**:lsof -i:8080 直接杀进程。
- **启动慢**:加 -Djava.security.egd=file:/dev/./urandom 提速。
- **日志乱码**:在 systemd 文件里加 Environment="LANG=zh_CN.UTF-8"。
- **内存溢出**:先 top 看 RES,再 jmap -heap 查各区占比。
九、一键完整脚本
把下面整段丢进 install.sh,chmod +x 后直接跑,**五分钟出结果**。
#!/bin/bash
set -e
APP_NAME=app
APP_PORT=8080
APP_USER=app
APP_GROUP=app
APP_DIR=/opt/app
JAR_NAME=$APP_DIR/app.jar
groupadd -r $APP_GROUP || true
useradd -r -g $APP_GROUP -s /sbin/nologin -d $APP_DIR -m $APP_USER || true
mv *.jar $JAR_NAME
chown $APP_USER:$APP_GROUP $JAR_NAME
chmod 500 $JAR_NAME
cat >/etc/systemd/system/$APP_NAME.service <<'EOF'
[Unit]
Description=SpringBoot App
After=network.target
[Service]
Type=simple
User=app
Group=app
WorkingDirectory=/opt/app
ExecStart=/usr/bin/java -Xms512m -Xmx512m -XX:+UseG1GC -jar /opt/app/app.jar
SuccessExitStatus=143
Restart=on-failure
RestartSec=10
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable $APP_NAME
systemctl start $APP_NAME
firewall-cmd --permanent --add-port=$APP_PORT/tcp
firewall-cmd --reload
echo "Deploy done. Check: journalctl -u $APP_NAME -f"
CentOS7 无 Tomcat 跑 SpringBoot,**核心就是 systemd 托管 + 普通用户隔离 + 防火墙最小化**。脚本固化后,上线、回滚、排查都一条命令,再也不用折腾臃肿的容器。
