Spring Boot下基於Profile動態替換配置資訊
引言: 在SpringBoot對程式開發做了大量的簡化和約定,本文將基於Spring Boot來展示如何進行profile的切換以及部署中基於profile中進行配置資訊的動態替換。
1. 基於環境
Spring Boot 1.4.1 Release, STS, JDK 1.8
2. 建立Spring Boot專案
開啟STS 3.8.2, STS是Spring官方的開發工具。 開啟File --> New--> Spring Starter Project,開啟如下介面:
設定專案名稱,目錄位置,groupId,artifactId等資訊,點選Next,
選取依賴包,這裡主要是使用了Spring Boot專案提供的工具包;我這裡選用devTool,然後點選Finish完成操作。
接下來,我們來檢視一下Spring Boot的專案目錄結構:
在STS中,基於Spring Boot的專案會在右上角新增一個S的標識,專案名稱後面新增[boot]標識,這裡使用了Spring Boot提供了devtool輔助工具,故【devtools]也被寫入了專案的名稱之中。
相對於maven的專案,新增了mvnw.sh和mvnw.cmd兩個檔案,這兩個檔案其實是maven wrapper檔案,那有人就會問了,這兩個檔案有什麼用呀?這裡它的用處也是非常友好的,就是不再假設本地已經按照maven庫; 當本地沒有安裝maven之時,就自動在後臺進行下載,自動安裝maven,然後執行後續的命令和操作,是不是很友好呀?
3. 新增配置資訊
新增db.xml和test.properties兩個配置檔案資訊, db.xml的資訊如下:
<?xml version="1.0" encoding="UTF-8"?>
<info>@[email protected]</info>
test.properties的資訊如下:[email protected]@
相比於maven中的佔位符,可以發現兩者的佔位符是不一樣的,Spring boot使用@[email protected]來表示,maven使用${key_val}來標識佔位符。我們來看一下專案的配置資訊:
這裡可以看到新增config目錄,目錄下有2個配置檔案。 application.properties是系統預設提供的全域性配置資訊。
4. 更新pom.xml檔案內容
在pom.xml中新增了resources的配置資訊,在profile中新增了filter資訊,具體如下:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.cuckoo.report</groupId>
<artifactId>brain</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>MavenDemo</name>
<description>Cuckoo Threat Analysis</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.4.1.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
</build>
<profiles>
<profile>
<id>test</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<test.infos>replacedKey</test.infos>
</properties>
<build>
<filters>
<filter>src/main/resources/config/db.xml</filter>
<filter>src/main/resources/config/test.properties</filter>
</filters>
</build>
</profile>
</profiles>
</project>
大家可以發現maven的外掛都是通過spring-boot-maven-plugin來完成相關元件的引入的,無需在額外引入其他相關的plugins了,是不是很簡單?‘5. 執行部署或者打包
切換至專案根目錄,在命令列可以執行2組命令,可以執行mvn相關命令,也可以執行mvnw相關的spring-boot命令,關於Spring boot的命令主要有以下幾種:
- spring-boot:runruns your Spring Boot application. 主要的啟動命令
- spring-boot:repackagerepackages your jar/war to be executable.
- spring-boot:startandspring-boot:stopto manage the lifecycle of your Spring Boot application (i.e. for integration tests).
- spring-boot:build-infogenerates build information that can be used by the Actuator.
這裡也可以使用mvnw spring-boot:run來啟動應用,從而檢查配置資訊是否被動態的替換。
mvn的命令仍然與原有的命令一致,這裡使用mvn package來打包測試配置資訊的過濾:
D:\Dev\workspace\MavenDemo>mvn package -Dmaven.test.skip=true
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building MavenDemo 0.0.1-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ brain ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] Copying 3 resources
[INFO]
[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ brain ---
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 1 source file to D:\Dev\workspace\MavenDemo\target\classes
[INFO]
[INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ bra
[INFO] Not copying test resources
[INFO]
[INFO] --- maven-compiler-plugin:3.1:testCompile (default-testCompile) @ brain --
[INFO] Not compiling test sources
[INFO]
[INFO] --- maven-surefire-plugin:2.18.1:test (default-test) @ brain ---
[INFO] Tests are skipped.
[INFO]
[INFO] --- maven-jar-plugin:2.6:jar (default-jar) @ brain ---
[INFO] Building jar: D:\Dev\workspace\MavenDemo\target\brain-0.0.1-SNAPSHOT.jar
[INFO]
[INFO] --- spring-boot-maven-plugin:1.4.1.RELEASE:repackage (default) @ brain ---
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 4.448 s
[INFO] Finished at: 2016-10-17T15:26:19+08:00
[INFO] Final Memory: 25M/208M
[INFO] ------------------------------------------------------------------------
切換至專案根目錄/targe/classes下檢視配置資訊,即可發現佔位符已經被正確替換了。 然後一切操作完成了。
6. 擴充套件閱讀