对于环境的不同,需要配置的参数信息也是不同,所以SpringBoot提供了spring.profiles.avtive参数进行配置,但是通过手动修改参数的方式难免有些不方面,并且这个参数在每个环境都是不一样的,并不能直接写死,提交代码的时候还容易遗忘是否改过了,为此SpringBoot提供了一种通过@占位符+Maven配置的方式来方便的切换工作环境。

首先spring.profiles.avtive是需要可以动态切换的,所以这里先使用一个@占位符来表示环境变量,如下

spring:
    profiles:
      active: @profileActive@

然后在pom.xml通过profiles定义需要的工作环境设置,我的配置如下

<profiles>
    <profile>
        <id>dev</id>
        <properties>
            <profileActive>dev</profileActive>
        </properties>
        <activation>
            <activeByDefault>true</activeByDefault>
        </activation>
    </profile>
    <profile>
        <id>test</id>
        <properties>
            <profileActive>test</profileActive>
        </properties>
    </profile>
    <profile>
        <id>local</id>
        <properties>
            <profileActive>local</profileActive>
        </properties>
    </profile>
</profiles>

这里的true设置为默认环境,使用打包命令无需指定环境的profileActive

然后根据application-xx.yml的命名规则准备对应数量的配置文件,如

  • application-test.yml
  • application-dev.yml
  • application-local.yml

这里每个profile里的profileActive都和application.yml中的profileActive对应,这时候刷新Maven配置,在idea的Maven插件上会出环境选项,点击箭头所指的刷新按钮即可更新Maven项目配置,但是要注意的是,每次切换之前记得通过 mvn clean 清除编译的target,不然会提示关于profileActive之类的错误。

Maven多环境切换及打包_配置文件

以及,需要在idea的spring插件的Active profiles设置 profiles 选项

Maven多环境切换及打包_xml_02

开发时问题解决,那打包的时候我们也需要根据不同的环境打包,可以通过Maven进行环境打包

mvn clean package -P test //打包test环境
mvn clean package //不指定环境变量则使用默认profileActive,通过<activeByDefault>指定

这里就表示打包test环境的jar包,打包后解压jar看application.yml的profileActive就变成了test

多余的配置文件我们是不需要的,一个环境只需要一个application-xx.yml,那么可以通过Maven配置resource的includes来排除其他的多余的配置文件,我的配置如下

<build>
    <finalName>${project.artifactId}</finalName>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>
                <fork>true</fork>
            </configuration>
        </plugin>
    </plugins>
    <resources>
        <resource>
            <directory>src/main/java</directory>
            <includes>
                <include>**/*.yml</include>
                <include>**/*.properties</include>
                <include>**/*.xml</include>
            </includes>
            <filtering>false</filtering>
        </resource>
        <resource>
            <directory>src/main/resources</directory>
            <includes>
                <include>application-${profileActive}.yml</include>
                <include>application.yml</include>
                <include>**/*.xml</include>
            </includes>
            <filtering>true</filtering>
        </resource>
    </resources>
</build>

这里的<include>application-${profileActive}.yml</include>配置即可只导入对应环境名称的配置文件,其他环境的配置文件则会排除在外。

另外为了打包方便,也可以将mvn clean package -P xx命令编写成一个bat或sh脚本,打包时直接调用即可。