Spring Boot应用 打包与部署指南

一、前言

  • 本篇主要包含哪些内容?
  1. 通过Maven将Spring Boot应用打包成jar包
  2. 将打包的jar包传输的服务器并配置启动、停止脚本
  3. 将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工具栏

图形化操作就很简单了。两个步骤:

  1. clean
  2. 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

配置完成之后,重新打包即可

参考:https://ken.io/note/springboot-course-basic-helloworld

三、部署

1、 准备工作

通过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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏我的小碗汤

这个404你能解决吗?

去看webapps里工程目录下,index.html文件是有的,见鬼了,是哪儿出了问题?

1643
来自专栏nice_每一天

Java-JMS Bug记录

1.Junit测试时,使用for循环发送JMS(ReportQuestionSender)的时候,监听器(ReportQuestionListener)只接受到...

1103
来自专栏腾讯云安全的专栏

Resin安全配置小技巧

2674
来自专栏晓晨的专栏

Gogs搭建教程-极易搭建的自助 Git 服务

4233
来自专栏marsggbo

解决ping 127.0.0.1 一般故障 问题

​故障如下图: ? 绕了好一大圈才发现是goupi防火墙搞的鬼,弄得我一些软件一直运行不了!!!!! 废话不多说,关了防火墙就行了:操作步骤如下图示 ? ​...

4895
来自专栏JavaEdge

SpringBoot统一异常处理BasicErrorController定义全局异常处理类:并用@ControllerAdvice注解自定义异常类,继承Exception(或RuntimeExcept

1.3K9
来自专栏玩转JavaEE

分布式配置中心Spring Cloud Config初窥

随着我们的分布式项目越来越大,我们可能需要将配置文件抽取出来单独管理,Spring Cloud Config对这种需求提供了支持。Spring Cloud Co...

3534
来自专栏about云

从零教你在Linux环境下(ubuntu)如何编译hadoop2.4

问题导读: 1.如果获取hadoop src maven包? 2.编译hadoop需要装哪些软件? 3.如何编译hadoop2.4? 扩展: 编译hadoo...

37111
来自专栏用户2442861的专栏

使用IntelliJ IDEA开发SpringMVC网站(二)框架配置

注:此文承接上一文:使用IntelliJ IDEA开发SpringMVC网站(一)开发环境

1291
来自专栏搜云库

Spring Cloud(十)高可用的分布式配置中心 Spring Cloud Config 中使用 Refresh

上一篇文章讲了SpringCloudConfig 集成Git仓库,配和 Eureka 注册中心一起使用,但是我们会发现,修改了Git仓库的配置后,需要重启服务,...

23010

扫码关注云+社区

领取腾讯云代金券