Skip to content

六、Spring Boot中多环境配置

1、指定项目配置文件

我们知道,在实际项目中,一般有两个环境:开发环境和生产环境。开发环境中的配置和生产环境中的配置往往不同,比如:环境、端口、数据库、相关地址等等。我们不可能在开发环境调试好之后,部署到生产环境后,又要将配置信息全部修改成生产环境上的配置,这样太麻烦,也不科学。

最好的解决方法就是开发环境和生产环境都有一套对用的配置信息,然后当我们在开发时,指定读取开发环境的配置,当我们将项目部署到服务器上之后,再指定去读取生产环境的配置。

我们新建两个配置文件: application-dev.ymlapplication-pro.yml,分别用来对开发环境和生产环境进行相关配置。这里为了方便,我们分别设置两个访问端口号,开发环境用 8001,生产环境用 8002.

yaml
# 开发环境配置文件
server:
  port: 8001
yaml
# 开发环境配置文件
server:
  port: 8002

然后在 application.yml 文件中指定读取哪个配置文件即可。比如我们在开发环境下,指定读取 applicationn-dev.yml 文件,如下:

yaml
spring:
  profiles:
    active:
    - dev

这样就可以在开发的时候,指定读取 application-dev.yml 文件,访问的时候使用 8001 端口,部署到服务器后,只需要将 application.yml 中指定的文件改成 application-pro.yml 即可,然后使用 8002 端口访问,非常方便。

运行 jar 的时候指定

sh
java -jar xxx.jar --spring.profiles.active=test

2、Maven 的多环境配置

Maven 本身也提供了对多环境的支持,不仅仅支持 Spring Boot 项目,只要是基于 Maven 的项目都可以配置。

Maven 对于多环境的支持在功能方面更加强大,支持 JDK版本 、 资源文件 、 操作系统 等等因素来选择环境。

创建多环境配置文件

创建不同环境的配置文件,分别是 application-dev.propertiesapplication-test.propertiesapplication-prod.properties

加上默认的配置文件 application.properties 同样是四个配置文件。

定义激活的变量

需要将 Maven 激活的环境作用于 Spring Boot ,实际还是利用了 spring.profiles.active 这个属性,只是 现在这个属性的取值将是取值于 Maven 。配置如下:

java
 spring.profiles.active=@profile.active@

profile.active 实际上就是一个变量,在 maven 打包的时候指定的 -P test 传入的就是值。

pom 文件中定义 profiles

需要在 mavenpom.xml 文件中定义不同环境的 profile ,如下:

xml
<!--定义三种开发环境-->
      <profiles>
            <profile>
					<!--不同环境的唯一id-->
                  <id>dev</id>
                  <activation>
						<!--默认激活开发环境-->
                        <activeByDefault>true</activeByDefault>
                  </activation>
                  <properties>
						<!--profile.active对应application.yml中的@profile.active@-->
                        <profile.active>dev</profile.active>
                  </properties>
</profile>
			<!--测试环境-->
            <profile>
                  <id>test</id>
                  <properties>
                        <profile.active>test</profile.active>
                  </properties>
            </profile>
			<!--生产环境-->
            <profile>
                  <id>prod</id>
                  <properties>
                        <profile.active>prod</profile.active>
                  </properties>
            </profile>
</profiles>

标签 <profile.active>正是对应着配置文件中的 @profile.active@<activeByDefault> 标签指定了默认激活的环境,则是打包的时候不指定 -P 选项默认选择的环境。

以上配置完成后,将会在IDEA的右侧 Maven 选项卡中出现以下内容:

image-20220504233207595

可以选择打包的环境,然后点击 package 即可。

或者在项目的根目录下用命令打包,不过需要使用-P指定环境,如下:

sh
mvn clean package package -P test

maven 中的profile 的激活条件还可以根据 jdk 、 操作系统 、 文件存在或者缺失 来激活。这些内容都是在 标签中配置,如下:

xml
<!--activation用来指定激活方式,可以根据jdk环境,环境变量,文件的存在或缺失-->
   <activation>
		<!--配置默认激活-->
         <activeByDefault>true</activeByDefault>
		<!--通过jdk版本--> <!--当jdk环境版本为1.8时,此profile被激活--> 
       <jdk>1.8</jdk> 
       <!--当jdk环境版本1.8或以上时,此profile被激活--> 
       <jdk>[1.8,)</jdk>
		<!--根据当前操作系统-->
         <os>
            <name>Windows XP</name>
            <family>Windows</family>
            <arch>x86</arch>
            <version>5.1.2600</version>
         </os>
   </activation>

资源过滤

如果你不配置这一步,将会在任何环境下打包都会带上全部的配置文件,但是我们可以配置只保留对应环境下的配置文件,这样安全性更高。

这一步配置很简单,只需要在 pom.xml 文件中指定 <resource> 过滤的条件即可,如下:

xml
<build>
   <resources>
       <!--排除配置文件-->
	<resource> 
        <directory>src/main/resources</directory> 
        <!--先排除所有的配置文件-->
		<excludes>
			<!--使用通配符,当然可以定义多个exclude标签进行排除-->
            <exclude>application*.properties</exclude>
        </excludes>
	</resource>
       
<!--根据激活条件引入打包所需的配置和文件-->
	<resource> 
   	 <directory>src/main/resources</directory> 
    	<!--引入所需环境的配置文件--> 
    	<filtering>true</filtering>
        <includes>
            <include>application.yml</include> 
                <!--根据maven选择环境导入配置文件-->
            <include>application-${profile.active}.yml</include>
        </includes>
      </resource>
   	</resources>
</build>

上述配置主要分为两个方面,第一是先排除所有配置文件,第二是根据 profile.active 动态的引入配置 文件。