Spring Boot应用 打包与部署指南
https://cloud.tencent.com/developer/article/1333889
一、前言
- 本篇主要包含哪些内容?
- 通过Maven将Spring Boot应用打包成jar包
- 将打包的jar包传输的服务器并配置启动、停止脚本
- 将Spring Boot应用配置为系统服务并配置开机启动
- Spring Boot的打包与部署有何特点?
Java Web应用在Spring Boot之前,通常是打包成war(Web application ARchive)包,结合Tomcat来完成部署。
对于Spring Boot,Spring官方的建议是将Spring Boot应用打包成一个fat jar(Java ARchive),通过java命令来启动运行。这个fat jar会把Tomcat内置进来,所以部署时也不需要单独配置Tomcat。
Spring官方的打包说明: https://docs.spring.io/spring-boot/docs/1.5.9.RELEASE/reference/htmlsingle/#getting-started-first-application-executable-jar
- 本篇环境信息
开发环境:
用途 |
工具&版本 |
---|---|
操作系统 |
Windows 10 |
开发工具 |
IntelliJ IDEA 2017 |
打包工具 |
Maven 3.X |
JDK |
1.8.x |
传输工具 |
FlashFxp |
生产环境:
用途 |
工具&版本 |
---|---|
操作系统 |
CentOS 7 |
JDK |
1.8.x |
传输工具 |
Vsftp |
CentOS 7快速上手教程:https://ken.io/serie/centos7-quickstart
二、打包
打包工具的话如前面提到的,我们使用的是Maven
首先需要在pom.xml文件build节点增加如下配置:
<build> <finalName>springboot-course</finalName> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build>
另外,需要确认pom.xml文件的package节点配置:
<packaging>jar</packaging>
本篇ken.io会介绍两种打包方式,一个是Maven命令打包。一个是IDEA+Maven插件打包。
1、 Maven命令打包
- 准备工作
配置Java、Maven环境变量
参考:http://wiki.jikexueyuan.com/project/maven/environment-setup.html
- cmd:进入项目目录
本次项目目录是:D:\Projects\GitHub\springboot-course\package-maven
d: & cd D:\Projects\GitHub\springboot-course\package-maven
- 清理package
#清理已存在的编译结果 mvn clean #清理成功后输出信息示例 [INFO] ----------------------------------------------------------- [INFO] BUILD SUCCESS [INFO] -----------------------------------------------------------
- 打包
#打包 mvn package #清理成功后输出信息示例 [INFO] ----------------------------------------------------------- [INFO] BUILD SUCCESS [INFO] ----------------------------------------------------------- #清理成功后会在项目根目录生成target文件夹 #查看是否生成target文件夹 ls #查看是否生了jar文件 ls target #根据pom.xml文件的配置,生成的jar文件名是:springboot-course.jar
2、IDEA + Maven插件打包
通过View->Tool Windows->Maven projects 呼出Maven工具栏 或者通过IDEA右侧工具栏呼出Maven工具栏
图形化操作就很简单了。两个步骤:
- clean
- package
成功之后也会在IDEA 控制台显示以下输出:
[INFO] -------------------------------------------------------------------- [INFO] BUILD SUCCESS [INFO] -------------------------------------------------------------------- [INFO] Total time: 7.839 s [INFO] Finished at: 2017-12-09T13:36:40+08:00 [INFO] Final Memory: 21M/218M [INFO] --------------------------------------------------------------------
生成的jar包路径:项目根目录\target\springboot-course.jar
3、本地运行测试
- 通过java命令运行jar包
#进入jar包所在目录 d: & cd D:\Projects\GitHub\springboot-course\package-maven\target #执行 java -jar springboot-course.jar #运行成功后会输出如下信息(部分信息略去) [main] o.s.j.e.a.AnnotationMBeanExporter : Registering beans for JMX exposure on startup [main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat started on port(s): 8080 (http) [main] i.k.springboot.course.CourseApplication : Started CourseApplication in 5.569 seconds (JVM running for 6.363)
通过浏览器访问:localhost:8080,验证是否正常
- 端口号
在/src/main/resources下新建配置文件application.yml
文件内容:
server: port: 8081
配置完成之后,重新打包即可
三、部署
1、 准备工作
- JDK 1.8部署 https://ken.io/note/centos-java-setup
- FTP服务端部署 https://ken.io/note/centos-quickstart-ftpserver
通过FTP将jar包上传到CentOS的 /webroot/helloweb 目录
- 创建日志目录:
#创建应用目录&日志目录 sudo mkdir /webroot/helloweb sudo mkdir /webroot/helloweb/logs #修改文件夹权限 sudo chmod 777 /webroot/helloweb sudo chmod 777 /webroot/helloweb/logs
- 开放端口
#添加可访问端口 sudo firewall-cmd --add-port=8081/tcp --permanent #重新加载防火墙策略 sudo firewall-cmd --reload
2、启动&停止脚本
- 创建启动脚本
#创建启动脚本start.sh sudo vi /webroot/helloweb/start.sh
脚本内容:
#!/bin/sh #指定JDK目录&AppName export JAVA_HOME=/usr/java/jdk1.8.0_151 APP_NAME=springboot-course.jar echo $JAVA_HOME echo $APP_NAME #nohup命令后台启动jar包并写入日志 nohup java -jar $APP_NAME >>logs/start.log 2>>logs/startError.log & #sleep等待15秒后,判断包含AppName的线程是否存在 sleep 15 if test $(pgrep -f $APP_NAME|wc -l) -eq 0 then echo "Start Failed" else echo "Start Successed" fi
- 创建停止脚本
#创建停止脚本文件 sudo vi /webroot/helloweb/stop.sh
脚本内容:
#!/bin/sh #指定AppName APP_NAME=springboot-course.jar #找到包含AppName的进程 PROCESS=`ps -ef|grep $APP_NAME|grep -v grep |awk '{ print $2}'` #循环停用进程直到成功 while : do kill -9 $PROCESS > /dev/null 2>&1 if [ $? -ne 0 ];then break else continue fi done echo 'Stop Successed'
- 启动/停止站点
#启动 sh /webroot/helloweb/start.sh #停止 sh /webroot/helloweb/stop.sh
3、部署访问测试
访问 http://<ip address>:8081
验证是否正常即可
四、开启启动&Nginx反向代理配置
1、CentOS 7 开机自动Spring Boot应用
- 将站点停止脚本标记为可执行文件
chmod +x /webroot/helloweb/stop.sh
- 创建helloweb服务
#创建服务文件 sudo vi /usr/lib/systemd/system/helloweb.service #文件内容 [Unit] Description=helloweb After=network.target [Service] WorkingDirectory=/webroot/helloweb ExecStart=/usr/java/jdk1.8.0_151/java -jar /webroot/helloweb/springboot-course.jar ExecStop=/webroot/helloweb/stop.sh Restart=always RestartSec=10 [Install] WantedBy=multi-user.target
- 设置服务开机启动&开启服务
#设置服务开机启动 sudo systemctl enable helloweb #启动服务 sudo systemctl start helloweb
2、Nginx反向代理配置
- 创建helloweb站点配置
#新建配置文件 sudo vi /etc/nginx/conf.d/helloweb.conf #反向代理配置内容 server { listen 80; #监听80端口 server_name helloweb.mydomain.com; #绑定的域名 location / { #转发或处理 proxy_pass http://localhost:8081; } error_page 500 502 503 504 /50x.html;#错误页 location = /50x.html { root /usr/share/nginx/html; } }
- 重载Nginx配置
sudo nginx -s reload
- 开放防火墙端口
#添加可访问端口 sudo firewall-cmd --add-port=80/tcp --permanent #重新加载防火墙策略 sudo firewall-cmd --reload
访问测试: 通过设置本地hosts将helloweb.mydomain.com指向服务器IP
然后通过浏览器访问: helloweb.mydomain.com
即可
五、备注
- 本篇源代码
https://github.com/ken-io/springboot-course/tree/master/package-maven