1. 程式人生 > >整合maven和Spring boot的profile功能

整合maven和Spring boot的profile功能

原文來自

 

由於專案的需要, 今天給spirng boot專案添加了profile功能。再網上搜索了一圈,也沒有找到滿意的參考資料,其實配置並不難,就是沒有一個one stop(一站式)講解的地方,所以有了寫這篇部落格的想法。由於本人水平有限,文中任何錯誤和紕漏歡迎大家反饋。希望本文可以給你帶來幫助。

    本文實現的目標:

           1 使用了maven的profile功能

           2 使用了Spring Boot的profile功能

           3 集成了1和2的功能

           4 在eclipse中執行mvn工程,使用開發環境的profile。

           5 通過mvn在命令列中打包時,可以指定相應的profile。

 

什麼是profile,解決什麼問題呢?舉個例子。一般在開發專案的時候要有多個環境,如開發環境、測試環境、生產環境,他們的配置檔案一般不同。當我們要向各個環境釋出程式時,需要人工處理這些配置檔案,這顯然麻煩且易錯。有了profile,一切問題就簡單了。只要在maven打包時使用下面命令即可。

 

            mvn clean package -Dmaven.test.skip=true -P prod

            解釋一下, -P prod 就是告訴maven要使用名字為prod的profile來打包,即所有的配置檔案都使用生產環境(prod是自己定義的,在這裡自定義為生產環境)。

 

實現思路簡述:

    maven支援profile功能,當使用maven profile打包時,可以打包指定目錄和指定檔案,且可以修改檔案中的變數。spring boot也支援profile功能,只要在application.properties檔案中指定spring.profiles.active=xxx 即可,其中xxx是一個變數,當maven打包時,修改這個變數即可。

 

具體實現:

 

A段,介紹coolpro工程的配置。

    這個工程只需要修改pom.xml檔案即可,需要定義具體maven的profile。定義完畢之後,當我們使用mvn clean package -P dev 時,maven就知道了profileActive=dev這個屬性生效了。其中profileActive可以自己定義,就是一個maven的自定義屬性。

    pom.xml檔案如下:

 

B段,介紹coolpro-api工程的配置

    這個工程是一個web工程,主要是想根據指定的profile配置相應的spring boot執行環境。如:如果profile是dev,配置web伺服器的監聽埠為8010;profile為test,則埠為8020;profile為prod,則埠為8030。 

    工程中有4個檔案:

              application.properties, 包含通用配置的檔案。檔案中有[email protected]@的屬性。spring boot的profile是通過spring.profiles.active屬性來配置的,這裡的profileActive和上面coolpro工程中配置的profileActive屬性名要一致。這樣,在執行mvn命令時,maven就會幫我們將@[email protected]替換成指定的profile。

              application-dev.properties, 當mvn -P dev時, 需要打包這個檔案。

              application-test.properties, 當mvn -P test時, 需要打包這個檔案。

              application-prod.properties, 當mvn -P prod時, 需要打包這個檔案。

    pom.xml配置:


    application.properties檔案:

     其他3個檔案見截圖:

    

C段,介紹coolpro-core工程的配置

 

配置完成了。看效果。

1 在Eclipse環境中,直接執行專案。

2 使用maven命令,打包這個應用。

     1)以開發環境打包:mvn clean package -Dmaven.test.skip=true -P dev -e 

           結果如下:

       檢視api工程:

      

     檢視core工程:

 

以此類推, 可以執行

       mvn clean package -Dmaven.test.skip=true -P test -e 

       mvn clean package -Dmaven.test.skip=true -P prod -e 

 

注意兩點:

       1 在屬性檔案中替換變數時,使用@符合。 

       

        最開始,使用$符號,就是不能替換,在網上搜索一下,原來是maven的maven-resources-plugin可以定義這個替換的符號。通過eclipse提供的Maven Pom editor編輯器開啟pom.xml檔案,在“Effective POM”選項卡中,可以看到定義的是@這個符號。

      2 怎麼在啟動spring boot應用時,列印正在使用的profile,避免配置錯誤呢?可以參考如下程式碼。

 
  1. public static void main(String[] args) {

  2. ApplicationContext ctx = SpringApplication.run(RestApiApplication.class, args);

  3. String[] activeProfiles = ctx.getEnvironment().getActiveProfiles();

  4. for (String profile : activeProfiles) {

  5. logger.warn("Spring Boot 使用profile為:{}" , profile);

  6. }

  7. }