Spring可以使用Profile決定程序在不一樣環境下執行狀況,包含配置、加載Bean、依賴等。
Spring的Profile通常項目包含:dev(開發), test(單元測試), qa(集成測試), prod(生產環境)。由spring.profiles.active屬性決定啓用的profile。
SpringBoot的配置文件默認爲 application.properties(或yaml,此外僅以properties配置爲說明)。不一樣Profile下的配置文件由application-{profile}.properties管理,同時獨立的 Profile配置文件會覆蓋默認文件下的屬性。web
Maven一樣也有Profile設置,可在構建過程當中針對不一樣的Profile環境執行不一樣的操做,包含配置、依賴、行爲等。
Maven的Profile由 pom.xml 的<Profiles>標籤管理。每一個Profile中可設置:id(惟一標識), properties(配置屬性), activation(自動觸發的邏輯條件), dependencies(依賴)等。
此文章不對Spring和Maven的Profile做過多說明,詳細狀況請自行查閱。spring
因爲構建是基於Maven(或Gradle,此處僅以Maven說明)。因此使用Maven管理Spring構建時的Profile是很是方便的。
Maven管理Spring Profile分五步,如下詳細介紹。apache
在SpringBoot MVC項目中,默認之內嵌Tomcat運行,若是須要特殊的設置或者使用Undertow,須要去掉默認的Tomcat依賴:tomcat
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> </exclusion> </exclusions> </dependency>
若是你同時使用了 MyBatis,須要去掉tomcat-jdbc依賴:bash
<dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <exclusions> <exclusion> <groupId>org.apache.tomcat</groupId> <artifactId>tomcat-jdbc</artifactId> </exclusion> </exclusions> </dependency>
在項目(若是有模塊爲具體模塊)的pom.xml下設置:mybatis
<!-- Maven控制Spring Profile --> <profiles> <profile> <id>dev</id> <activation> <activeByDefault>true</activeByDefault> </activation> <properties> <profileActive>dev</profileActive> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> </dependency> <dependency> <groupId>org.apache.tomcat</groupId> <artifactId>tomcat-jdbc</artifactId> </dependency> </dependencies> </profile> <profile> <id>prod</id> <properties> <profileActive>prod</profileActive> </properties> </profile> </profiles>
從上面的配置能夠看出,Maven的Profile配置了兩個:dev和prod,而且在dev中使用了內嵌Tomcat,而 prod 中沒有,因此這兩個Profile打包的文件dev能夠直接運行(Plugin使用了SpringBoot Plugin),而prod並不能直接運行(或部署在外部Tomcat下,並不推薦這樣,後面會說明)。
properties中的profileActive是咱們申明的屬性,此處對應Spring的Profile值。app
SpringBoot的 Profile選擇須要在 application.properties中配置,若是定死在文件,那麼每次打包都須要手動修改,很麻煩,並且容易出錯。
Maven的資源過濾功能能夠實如今構建時修改以「@xxx@」表示的屬性。資源過濾須要在pom.xml的<build>標籤下配置 resources:maven
<!-- profile對資源的操做 --> <resources> <resource> <directory>src/main/resources</directory> <excludes> <exclude>application*.properties</exclude> </excludes> </resource> <resource> <directory>src/main/resources</directory> <!-- 是否替換@xx@表示的maven properties屬性值 --> <filtering>true</filtering> <includes> <include>application.properties</include> <include>application-${profileActive}.properties</include> </includes> </resource> </resources>
上面的第一個resource去掉了src/main/resources下的全部application*.properties文件,「*」是通配符,表示此處有任何內容(沒有也能夠)都匹配。
第二個resource添加了application.properties默認配置文件和由profileActive屬性決定的相應profile配置文件。而且filtering爲true表示,會將文件內容的「@xx@」替換爲相應的變量(如文件中的@profileActive@會替換爲profileActive屬性值)。spring-boot
在application.properties默認配置文件中配置:單元測試
spring.profiles.active = @profileActive@
@profileActive@表示該屬性值會在maven構建時被替換掉。
構建命令:
mvn clean package -Pdev
上面的命令會根據Maven Profile的 dev構建環境包,若是須要prod包,則把-P的參數替換成prod便可。
爲了方便我會在每一個項目下生成一個build.sh文件,內容以下:
#!/bin/bash profileActive=prod if [ -n "$1" ]; then profileActive=$1 fi mvn clean package -Dmaven.test.skip=true -P$profileActive
該腳本接收一個參數,即打包對應的Profile。默認狀況下若是不帶參數,會打包prod環境包。
須要注意的是,該命令跳過了測試。
完成了上面的五步,便可使項目根據你的構建參數的不一樣,打包出不一樣環境下運行的包。