1. 程式人生 > 其它 >一次打包,多個環境執行(開發、測試、生產等)

一次打包,多個環境執行(開發、測試、生產等)

以前常用的,使用maven外掛根據不同環境(開發、測試、線上)打不同的包,方便吧? 也還可以,但是打各個環境的包配置檔案不一樣(maven打包是指定了編譯配置檔案,未指定不會打包進來),有時候包會出現混淆,影響使用;最近使用了jar啟動命令指定profiles檔案,個人感覺更加合理一些,不使用maven外掛打包,就打一個包,在不同的環境下,配置不同的啟動引數就可以了,啟動命令只需配置一次,一個包,就能用到不同的環境,開發、測試、線上環境都可以用,簡單介紹下。

1、問題描述

以前常用的,使用maven外掛根據不同環境(開發、測試、線上)打不同的包,方便吧? 也還可以,但是打各個環境的包配置檔案不一樣(maven打包是指定了編譯配置檔案,未指定不會打包進來),有時候包會出現混淆,影響使用;最近使用了jar啟動命令指定profiles檔案,個人感覺更加合理一些,不使用maven外掛打包,就打一個包,在不同的環境下,配置不同的啟動引數就可以了,啟動命令只需配置一次,一個包,就能用到不同的環境,開發、測試、線上環境都可以用,簡單介紹下。

2、解決方案

簡單來說就是使用jar啟動命令的時候,指定不同的profiles,來達到一次打包,多個環境共用的目的。

2.1 application.yml簡要說明

(1)application.yml是預設載入使用的配置檔案,裡面的配置項會預設載入;

(2)通過新建多個yml,application-dev.yml,application-uat.yml,application-prod.yml,在application.yml中或java啟動的時候配置,可以啟用具體自定義yml;

例如:

spring:
   profiles:
      active: dev

專案會載入application.yml和application-dev.yml中的配置項;

springboot2.4(2020-11-12釋出)後版本,配置有點不一樣了,更改為:

spring.config.activate.on-profile=dev

(3)字尾名字要保持一致,否則會報找不到具體配置專案(不會報找不到yml);

(4)假如application.yml配置項與自定義yml(application-dev.yml等)一樣,以自定義yml配置項為準;

2.2 配置

(1)application.yml配置

spring:
   profiles:
      active: dev
server:
  port: 9090

test:
  app: 我是公共的application

(2)application-dev.yml配置

test:
  name: dev老王是帥哥

(3)application-prod.yml配置

test:
  name: prod老王是靚仔

2.3 新建測試controller方法

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/test")
public class TestController {
    @Value("${test.name}")
    private String name;
    @Value("${test.app}")
    private String app;

    @RequestMapping("/")
    public String test() {
        return app + "-------------" + name;
    }
}

2.4演示

(1)當active:dev

由展示可以看出:展示了application.yml和application-dev.yml配置項內容;

(2)active:prod的時候:

由展示可以看出:展示了application.yml和application-prod.yml配置項內容;

簡單總結:

(1)當時active選擇為:dev的時候,會載入application.yml和application-dev.yml兩個配置類;

(2)當時active選擇為:prod的時候,會載入application.yml和application-dev.yml兩個配置類;

利用這個特性,實現編譯打包一次,多個環境執行的目的;

2.5 一次打包多個環境執行

其實是利用java的jar包設定啟動引數的來實現的,dev伺服器環境執行命令:

nohup java -jar -server -Dserver.port=10001 -Xms1024M -Xmx1024M -Dspring.profiles.active=dev /usr/local/application/laowang/laowang.jar LAOWANG>/dev/null 2>&1 &

其中-Dspring.profiles.active=dev,作用就是與配置檔案配置active一樣,並且啟動命令中設定引數,級別高於配置檔案中,目前正在使用的:配置檔案中預設為dev,然後打包,根據不同伺服器環境配置不同的啟動引數,例如目前uat環境為:

nohup java -jar -server -Dserver.port=10001 -Xms1024M -Xmx1024M -Dspring.profiles.active=uat /usr/local/application/laowang/laowang.jar LAOWANG>/uat/null 2>&1 &

prod環境為:

nohup java -jar -server -Dserver.port=10001 -Xms1024M -Xmx1024M -Dspring.profiles.active=prod /usr/local/application/laowang/laowang.jar LAOWANG>/prod/null 2>&1 &

重點說明:

(1)這個方式不同於以前maven打包的環境,以前通過maven外掛打包部落格介紹過,是在編譯打包的時候就指定了打包的yml,指定dev環境的時候,application-uat.yml和application-prod.yml壓根就不會編譯和打包,這樣各個伺服器的啟動命令也一樣;但是也導致各個環境的包不一樣,有時候會攪渾,甚至打包的時候切換也容易出問題;

(2)目前的通過啟動命令執行配置檔案的方式,啟動命令在伺服器上更新記錄一次就好了,然後打包的時候,就可以實現多個環境(開發、uat、線上)同一個jar包,不容易混淆,個人認為更加合理一些;


更多資訊請關注公眾號:「軟體老王」,關注不迷路,軟體老王和他的IT朋友們,分享一些他們的技術見解和生活故事。

更多資訊請關注公眾號:「軟體老王」,關注不迷路,IT技術與相關乾貨分享,回覆關鍵字獲取對應乾貨,本文版權歸作者軟體老王所有,轉載需註明作者、超連結,否則保留追究法律責任的權利。