1. 程式人生 > >Spring Boot應用 打包與部署指南

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。

  • 本篇環境資訊

開發環境:

用途

工具&版本

作業系統

Windows 10

開發工具

IntelliJ IDEA 2017

打包工具

Maven 3.X

JDK

1.8.x

傳輸工具

FlashFxp

生產環境:

用途

工具&版本

作業系統

CentOS 7

JDK

1.8.x

傳輸工具

Vsftp

二、打包

打包工具的話如前面提到的,我們使用的是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環境變數

  • 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

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

三、部署

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 即可

五、備註

  • 本篇原始碼