April 21, 2018

资源文件分环境配置

How to separate your configure file by different enviroment

1. 关于maven build标签?

你可以在<profile>标签下声明<build>标签,也可以直接在<project>标签下声明<build>标签

                  
<build>
  <defaultGoal>package</defaultGoal>
  <directory>${basedir}/target</directory>
  <finalName>${artifactId}-${version}</finalName>
  ...
</build>
                  
                

defaultGoal,默认构建行为,如package,install等
directory,构建结果所在的路径,默认为${basedir}/target目录
finalName,构建结果的名字

如下图所示,默认构建行为:

构建结果所在的路径和名称:

resources标签引入资源文件,资源文件如properties或XML配置文件,无需编译,构建过程中会将资源文件从源路径复制到指定的目标路径。

                  
<!-- resources标签:声明资源文件 -->
<resources>
    <resource>
        <!-- 构建过程中是否对资源进行过滤 -->
        <filtering>true</filtering>
        <!-- 资源文件的路径 -->
        <directory>${basedir}/src/main/resources</directory>
        <!-- 资源文件的目标路径 -->
        <targetPath>META-INF/aaa</targetPath>
        <!-- 包含哪些文件 -->
        <includes>
            <include>**/application*.yml</include>
            <include>**/application*.yaml</include>
            <include>**/application*.properties</include>

            <include>**/application-${myActivateFile}.yml</include>
            <include>**/application-${myActivateFile}.yaml</include>
            <include>**/application-${myActivateFile}.properties</include>
        </includes>
        <!-- 不包含哪些文件 -->
        <excludes>
            <exclude>**/aaa*.properties</exclude>
        </excludes>
    </resource>
</resources>
                  
                

如下图所示,资源文件的目标路径:

不包含下列文件:

2. 怎样在不同的部署环境启用不同的配置文件?

通过激活不同的profile来使用不同的配置。

例如我的项目分离了3种开发环境的配置文件。

然后配置3个profile标签,分别为:local,test,prod,激活的profile不同,myActivateFile变量就不同。你可以在 <profile> 的 <activation> 元素下隐式激活了本地开发环境的配置。

                  
<!-- maven打包时指定配置文件 -->
<profiles>
    <!-- 本地开发环境 -->
    <profile>
        <id>dev</id>
        <properties>
            <myActivateFile>local</myActivateFile>
        </properties>
        <activation>
            <!-- 默认开启本地开发环境 -->
            <activeByDefault>true</activeByDefault>
        </activation>
    </profile>
    <!-- 测试环境 -->
    <profile>
        <id>test</id>
        <properties>
            <myActivateFile>test</myActivateFile>
        </properties>
    </profile>
    <!-- 生产环境 -->
    <profile>
        <id>pro</id>
        <properties>
            <myActivateFile>prod</myActivateFile>
        </properties>
    </profile>
</profiles>
                  
                

通过myActivateFile变量加载不同环境配置文件

                  
<!-- resources标签:声明资源文件 -->
<resources>
    <resource>
        <!-- 构建过程中是否对资源进行过滤 -->
        <filtering>true</filtering>
        <!-- 资源文件的路径 -->
        <directory>${basedir}/src/main/resources</directory>
        <!-- 包含哪些文件 -->
        <includes>
            <include>**/mapper/**/*.xml</include>
            <include>**/application.yml</include>
            <include>**/application.yaml</include>
            <include>**/application.properties</include>
            <include>**/application-${activatedProperties}.yml</include>
            <include>**/application-${activatedProperties}.yaml</include>
            <include>**/application-${activatedProperties}.properties</include>
        </includes>
        <!-- 不包含哪些文件 -->
        <excludes>
            <exclude>**/fileUnWanted.properties</exclude>
        </excludes>
    </resource>
</resources>
                  
                

现在默认激活的是local profile,打包后的配置文件如下:

3. 怎样在不同的部署环境启用不同的外部配置文件?

一些敏感的配置信息(例如连接信息),通常由运维人员配置管理,这就要求将这些信息从项目中分离出来,并在应用发布时加载。

分离连接信息后的application.yml配置如下:

在D:\IdeaProjects\springboot\conf目录下新建3个不同环境配置文件(如果时linux系统,改成对应linux路径),用来配置连接信息。

加入参数启动应用,加载外部配置文件。

启动成功即可。