前言

在开发中,我们经常会遇到环境问题。例如,开发环境和测试环境和线上环境,其数据库配置等各不相同。针对这种情况,一般我们采用的方式有一下几种:1. 打包后手动替换配置文件;2. 打包后使用CI工具解压-替换-压缩;3. 使用maven profile功能,打包时候就完成环境的分发。初级(菜鸟)一般使用方式1比较多,方式2则是运维喜欢做的事情,而方式3才是最为优雅的方式。本文采用maven profile的方式,结合spring profile,实现打包后即可运行,无需修改文件的效果。

操作步骤

  1. 配置pom.xml
<profiles>
        <profile>
            <id>dev</id>
            <!--dev为唯一名称,用于标识区分-->
            <properties>
                <!--profile.active可以换成别的,是一个环境变量值,用于整合srping profile-->
                <profile.active>dev</profile.active>
            </properties>
            <activation>
                <activeByDefault>true</activeByDefault>
            </activation>
        </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>
 <build>
        <resources>
            <resource>
                <directory>src/main/resources</directory>
                <excludes>
                    <exclude>application*.yml</exclude>
                    <exclude>**/*.conf</exclude>
                </excludes>
                <filtering>true</filtering>
            </resource>
            <resource>
                <directory>src/main/resources</directory>
                <filtering>true</filtering>
                <includes>
                    <include>application.yml</include>
                    <include>application-${profile.active}.yml</include>
                    <include>**/admin-${profile.active}.conf</include>
                </includes>
            </resource>
        </resources>

        <plugins>
            <plugin>
                <artifactId>maven-war-plugin</artifactId>
                <version>3.2.0</version>
            </plugin>

        </plugins>

解释:pom中的配置属于maven profile的配置项,其定义了3个环境dev,test和prod,dev是默认环境。使用profile.active环境变量关联spring profile。

  1. 配置application.yml

application.yml

spring:
  profiles:
    active: @profile.active@

application-dev.yml

server:
  port: 9004
  servlet:
    context-path: /resource-manage
spring:
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://*.*.*.*:40023/ecs
    username: root
    password: ****
  jpa:
    hibernate:
      ddl-auto: update
    database: mysql
    show-sql: true
    database-platform: org.hibernate.dialect.MySQL5InnoDBDialect
  servlet:
    multipart:
      enabled: true
      max-file-size: 200MB
      max-request-size: 215MB
      file-size-threshold: 2KB
  rabbitmq:
    addresses: ****
    username: admin
    password: ****
    port: 5672
kubernetes:
  admin-conf: classpath:k8s/admin-dev.conf

# 工作中心审核地址

approval:
  login_url: 
  approval_url: 
  username: 
  md5Password: 

application-prod.yml

server:
  port: 9004
  servlet:
    context-path: /resource-manage
spring:
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://******:3306/ecs
    username:
    password:
  jpa:
    hibernate:
      ddl-auto: update
    database: mysql
    show-sql: true
    database-platform: org.hibernate.dialect.MySQL5InnoDBDialect
  servlet:
    multipart:
      enabled: true
      max-file-size: 200MB
      max-request-size: 215MB
      file-size-threshold: 2KB
  rabbitmq:
    addresses: 
    username: 
    password: 
    port: 
kubernetes:
  admin-conf: classpath:k8s/admin-prod.conf

# 工作中心审核地址

approval:
  login_url: 
  approval_url: 
  username: 
  md5Password: 

application-test.yml

解释:对应pom中的3个环境变量,需要有对应的3个yml配置,另外application.yml定义了激活哪个配置,以及一些共同的配置项可以放置在application.yml中。除此以外的2个yml则各自定义自身的配置项,每个文件的后缀名也是固定的格式application-{xxx}.yml

  1. 使用

至此,maven多环境的配置已经完成,打包时候可以使用mvn clean package -P dev ,也可以直接在右侧的打包选项中勾选dev。

补充

以上只解释了不同环境下的配置文件的分发,其实我们还会存在一个问题:资源文件怎么处理?其实以上配置中已经给出答案:上述文件中的kubernetes.admin-conf是k8s资源文件,程序会加载这个配置文件访问k8s集群,上述配置项中使用**/admin-${profile.active}.conf进行了资源文件的分发。