SpringBoot中使用Profile的幾種方式
最近項目中進行倉庫拆分了之后,因為引入了公共包,所以就存在可能有snapshot版本以及release版本問題,比如我想要在dev環(huán)境的時候import snapshot版本,prod環(huán)境的時候又使用release版本,為了不頻繁修改pom.xml文件,因此決定使用POM的profile來解決這個問題。
當然由于maven默認是不下載snapshot包的,因此我們要配置讓它下載,這里分為全局配置和項目級別配置。
項目配置
在pom文件中添加如下內(nèi)容:
<repositories>
<repository>
<id>nexus</id>
<!--修改成自己私服地址-->
<url>http://localhost:18081/repository/maven-public/</url>
<releases>
<enabled>true</enabled>
<updatePolicy>always</updatePolicy>
</releases>
<snapshots>
<!--主要是這里-->
<enabled>true</enabled>
<updatePolicy>always</updatePolicy>
</snapshots>
</repository>
</repositories>
全局配置
在maven的settings.xml中新增配置,如果不配置profile,只配置mirror,是下載不了snapshot包的
<profiles>
<profile>
<id>bv-profile</id>
<repositories>
<repository>
<id>nexus</id>
<url>http://localhost:18081/repository/maven-public/</url>
<releases>
<enabled>true</enabled>
<updatePolicy>always</updatePolicy>
</releases>
<snapshots>
<enabled>true</enabled>
<updatePolicy>always</updatePolicy>
</snapshots>
</repository>
</repositories>
</profile>
</profiles>
回到正題,如何使用maven的profile呢?
maven profile
同樣的首先在pom.xml中新增配置:
<profiles>
<profile>
<id>dev</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<spring.profiles.active>dev</spring.profiles.active>
<bvpro.api.version>2.0.0-SNAPSHOT</bvpro.api.version>
</properties>
</profile>
<profile>
<id>prod</id>
<properties>
<spring.profiles.active>prod</spring.profiles.active>
<bvpro.api.version>1.9.0</bvpro.api.version>
</properties>
</properties>
</profile>
</profiles>
<resources>
<resource>
<!-- 指定配置文件所在的resource目錄 -->
<directory>src/main/resources</directory>
<includes>
<include>db/**</include>
<include>static/**</include>
<include>mapper/**</include>
<!-- 選擇要打包的配置文件和日志,當然也可以不加打包所有配置文件,然后由具體服務(wù)器來選擇使用哪個 -->
<include>bootstrap.yml</include>
<include>bootstrap-${spring.profiles.active}.yml</include>
<include>logback.xml</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
比如這里我就設(shè)定了兩個profile(dev, prod), 然后他們引用某個包的版本不一樣,然后應用包的時候這樣使用就行了
<dependencies>
<dependency>
<groupId>com.bvpro</groupId>
<artifactId>bvpro-common-api</artifactId>
<version>${bvpro.api.version}</version>
</dependency>
</dependencies>
然后項目中的bootstrap.yml文件中修改如下
# Spring
spring:
profiles:
# 環(huán)境配置
active: @spring.profiles.active@
然后當我們打包的時候 mvn clean package -P dev 就可以打包dev環(huán)境的配置,同時 @spring.profiles.active@ 會被替換成dev。
當然如果你使用idea的時候就更加簡單了,只需要勾選profile=dev就行了。
docker中使用
我們知道在使用dockerfile的時候也可以指定環(huán)境變量,然后啟動的時候就可以根據(jù)環(huán)境變量來啟動了,比如這樣子:
FROM openjdk:8-jre-alpine
ENV env_java_debug_enabled=false
EXPOSE 8080
WORKDIR /app
ADD target/smcp-web.jar /app/target/smcp-web.jar
ADD run.sh /app
ENTRYPOINT ["java","-Dspring.profiles.active=test", "-jar","target/smcp-web.jar"]
然后run.sh這樣寫:
可以看到我們在dockerfile中使用了ENV來指定我們要啟動什么環(huán)境,但是這種方式太僵硬了, 因為相當于把啟動什么環(huán)境給寫死了,后面想要切換到其他環(huán)境的時候還要去修改dockerfile,這種方式看上去不太行呀!
SPRING_PROFILES_ACTIVE
好在springboot項目啟動的時候會去讀這樣的一個特殊環(huán)境變量 SPRING_PROFILES_ACTIVE, 如果環(huán)境變量中配置了這個值,那么會根據(jù)這個值找到對應的profile, 然后啟動對應的環(huán)境,所以我么可以在啟動的時候指定這個環(huán)境變量就行了, 所以可以這樣子。
FROM openjdk:8-jre-alpine
ENV spring_profiles_active=dev
ENV env_java_debug_enabled=false
EXPOSE 8080
WORKDIR /app
ADD target/smcp-web.jar /app/target/smcp-web.jar
ADD run.sh /app
ENTRYPOINT ["java", "-jar","target/smcp-web.jar"]
這里預設(shè)了spring_profiles_active的值是dev,當啟動的時候你可以更改這個值。
如果你使用docker-compose來啟動,那么也可以在docker-compose文件中配置environment,比如:
environment:
- SPRING_PROFILES_ACTIVE=prod
這就是指定profile的各種方式了,使用這種方式我們可以更加精確的控制我們需要啟動的環(huán)境,并且還是最少的修改。