部署 jar 包到生产环境的科学方法

我们现在的线上环境都是简单的使用 nohup java -jar xxx.jar & 的命令来将项目启起来的(感谢 Spring Boot),不过这种方式有诸多不便,比如我们想停掉或者重启某个项目,都需要通过 ps 命令先找到程序对应的 pid,然后再执行 kill 命令,然后再手动启动一遍这个程序。

下边我介绍一种(自我认为)比较科学的方式:

以我们已有的 demo 项目 app-c 为例,在 build.gradle 中加入:

1
2
3
springBoot {
executable = true
}

这样可以编译出来可执行的 jar 包,看下前后对比,下边两张图分别是加之前和加之后 app-c ,可以看到多了 x 权限。

不带 x 权限的 app-c

x 权限的 app-c

我们来直接用 output/app-c-0.0.1-SNAPSHOT.jar 运行一下试试:


没有任何问问题。

接下来我们把这个可执行程序通过软链接的方式注册为系统服务:

sudo ln -s /opt/demo-projects/output/app-c-0.0.1-SNAPSHOT.jar /etc/init.d/app-c

这样就可以使用 startstoprestart 来管理我们的应用了

1
2
3
4
5
6
/etc/init.d/app-c start|stop|restart
service app-c start|stop|restart

并且 status 可以查看运行状态:


用这样的方式来管理线上应用,比之前的方式方便了很多:不需要再进到存放 jar 包的目录来用冗长的代码启动,只需知道应用名称,就可以直接启动、重启、停止我们想管理的应用。