SpringBoot项目打包时配置文件区分日常、测试、预发、正式环境

前言

在我们开发项目的时候,一般有四套环境:日常、测试、预发、正式。日常环境作为我们开发环境;测试环境给测试同学测试功能;预发环境给正式环境发布时提供准备;正式环境则是稳定的生产环境。
这四套环境,数据库、中间件以及其他一些配置多多少少都有一些不同,所以如果我们只用一个application配置文件的话肯定是有问题的,一般的做法是准备4个配置文件,用来区分4个环境,每个文件填入的配置内容互不干扰,然后在项目打包的时候指定文件即可。

如下图:
在这里插入图片描述

具体做法

1. 创建5个配置文件

这5个配置文件分别为:

  • application.properties
  • application-daily.properties
  • application-test.properties
  • application-pre.properties
  • application-publish.properties

项目结构如下:
SpringBoot项目打包时配置文件区分日常、测试、预发、正式环境_第1张图片

这里可能有同学有疑惑,既然有了4个环境的配置文件,为啥还要有application.properties这个文件?
这里的application.properties我们可以当做是一个配置文件容器,它可以将其他配置文件的内容加到这里来。还有一个原因就是因为SpringBoot项目启动的时候只认识application.properties文件,不认识其他四个。

2. 在pom.xml文件中如下配置


<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0modelVersion>
    <parent>
        <groupId>org.springframework.bootgroupId>
        <artifactId>spring-boot-starter-parentartifactId>
        <version>2.7.5version>
        <relativePath/> 
    parent>
    <groupId>com.examplegroupId>
    <artifactId>SpringBoot-configartifactId>
    <version>0.0.1-SNAPSHOTversion>
    <name>SpringBoot-configname>
    <description>Demo project for Spring Bootdescription>
    <properties>
        <java.version>1.8java.version>
    properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-webartifactId>
        dependency>

        <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-testartifactId>
            <scope>testscope>
        dependency>
    dependencies>

    
    <profiles>
        <profile>
            <id>dailyid>
            <activation>
                <activeByDefault>trueactiveByDefault>
            activation>
            <properties>
                <environment>dailyenvironment>
            properties>
        profile>
        <profile>
            <id>testid>
            <properties>
                <environment>testenvironment>
            properties>
        profile>
        <profile>
            <id>preid>
            <properties>
                <environment>preenvironment>
            properties>
        profile>
        <profile>
            <id>publishid>
            <properties>
                <environment>publishenvironment>
            properties>
        profile>
    profiles>

    
    <build>
        <finalName>springbootconfigfinalName>
        <resources>
            <resource>
                
                <directory>src/main/resourcesdirectory>
                <includes>
                    <include>application.propertiesinclude>
                    <include>application-${environment}.propertiesinclude>
                includes>
                <filtering>truefiltering>
            resource>
            <resource>
                <directory>src/main/resourcesdirectory>
                <includes>
                    <include>logback.xmlinclude>
                includes>
                <filtering>falsefiltering>
            resource>
            <resource>
                <directory>src/main/resourcesdirectory>
                <filtering>falsefiltering>
                <excludes>
                    <exclude>*.xmlexclude>
                    <exclude>*.propertiesexclude>
                excludes>
            resource>
        resources>
        <plugins>
            <plugin>
                <groupId>org.springframework.bootgroupId>
                <artifactId>spring-boot-maven-pluginartifactId>
                <version>2.1.13.RELEASEversion>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackagegoal>
                        goals>
                    execution>
                executions>
                <configuration>
                    <mainClass>com.example.springbootconfig.SpringBootConfigApplicationmainClass>
                configuration>
            plugin>
            
            <plugin>
                <artifactId>maven-antrun-pluginartifactId>
                <executions>
                    <execution>
                        <phase>packagephase>
                        <configuration>
                            <tasks>
                                <unzip
                                        src="${project.build.directory}/${project.build.finalName}.${project.packaging}"
                                        dest="${project.build.directory}/springbootconfig"/>
                            tasks>
                        configuration>
                        <goals>
                            <goal>rungoal>
                        goals>
                    execution>
                executions>
            plugin>
            <plugin>
                <groupId>org.springframework.bootgroupId>
                <artifactId>spring-boot-maven-pluginartifactId>
            plugin>
        plugins>

    build>
project>

这里我的配置有3个部分,直接复制我这个文件的同学要注意了。

第一部分


    <profiles>
        <profile>
            <id>dailyid>
            <activation>
                <activeByDefault>trueactiveByDefault>
            activation>
            <properties>
                <environment>dailyenvironment>
            properties>
        profile>
        <profile>
            <id>testid>
            <properties>
                <environment>testenvironment>
            properties>
        profile>
        <profile>
            <id>preid>
            <properties>
                <environment>preenvironment>
            properties>
        profile>
        <profile>
            <id>publishid>
            <properties>
                <environment>publishenvironment>
            properties>
        profile>
    profiles>

这个部分可以直接复制。这里设置environment变量,它的值一共有4个即daily、test、pre、publish,通过activeByDefault标签设置daily为默认配置。

第二部分

<resources>
    <resource>
        
        <directory>src/main/resourcesdirectory>
        <includes>
            <include>application.propertiesinclude>
            <include>application-${environment}.propertiesinclude>
        includes>
        <filtering>truefiltering>
    resource>
    <resource>
        <directory>src/main/resourcesdirectory>
        <includes>
            <include>logback.xmlinclude>
        includes>
        <filtering>falsefiltering>
    resource>
    <resource>
        <directory>src/main/resourcesdirectory>
        <filtering>falsefiltering>
        <excludes>
            <exclude>*.xmlexclude>
            <exclude>*.propertiesexclude>
        excludes>
    resource>
resources>

这个部分也可以直接复制。这里配置是指定打包那些类型的文件,有时候我们会遇到这样一个问题,发现有些文件不管怎么打包都没法打到jar包里面去,其实就是这个地方没有配置,默认给过滤掉了。

第三部分

<plugins>
    <plugin>
        <groupId>org.apache.maven.pluginsgroupId>
        <artifactId>maven-compiler-pluginartifactId>
        <version>3.8.1version>
        <configuration>
            <source>1.8source>
            <target>1.8target>
            <encoding>utf-8encoding>
        configuration>
    plugin>
    <plugin>
        <groupId>org.apache.maven.pluginsgroupId>
        <artifactId>maven-source-pluginartifactId>
        <version>2.2version>
        <executions>
            <execution>
                <id>attach-sourcesid>
                <goals>
                    <goal>jargoal>
                goals>
            execution>
        executions>
        <configuration>
            <finalName>${project.build.finalName}finalName>
        configuration>
    plugin>
    <plugin>
        <groupId>org.springframework.bootgroupId>
        <artifactId>spring-boot-maven-pluginartifactId>
        <version>2.1.13.RELEASEversion>
        <executions>
            <execution>
                <goals>
                    <goal>repackagegoal>
                goals>
            execution>
        executions>
        <configuration>
            <mainClass>com.example.springbootconfig.SpringBootConfigApplicationmainClass>
        configuration>
    plugin>
plugins>

这个部分要注意后面的mainClass,这里要写你们自己的类路径,不要搞错了。这里指定了打包和解压的插件和文件路径,还有启动类。这里的插件一个都不能少且路径不要配置错误,否则有可能会出现打包失败或者启动时找不到启动类

3. 在application.properties中加入环境变量

application.properties文件中有一个配置:spring.profiles.active。指定它就可以指定当前运行的环境,配置如下:

spring.application.name=SpringBoot-config
server.port=8080
management.server.port=8081
spring.mvc.view.prefix=/
spring.mvc.view.suffix=.html

#通过配置的方式激活环境
spring.profiles.active=@environment@ 

如果这个时候你是使用的是idea开发工具,那么在右侧的maven插件中就已经可以看到这几个环境了:
SpringBoot项目打包时配置文件区分日常、测试、预发、正式环境_第2张图片
当然没有idea开发工具的同学也不用担心,我们接下来直接使用打包指令就可以了

日常环境打包指令
mvn clean package -Dmaven.test.skip=true -P=daily

测试环境打包指令
mvn clean package -Dmaven.test.skip=true -P=test

预发环境打包指令
mvn clean package -Dmaven.test.skip=true -P=pre

正式环境打包指令
mvn clean package -Dmaven.test.skip=true -P=publish

打包出来的文件如下:
SpringBoot项目打包时配置文件区分日常、测试、预发、正式环境_第3张图片
这里就会出现你想要指定环境的配置文件,application.properties中的environment变量也会被替换为

spring.application.name=SpringBoot-config
server.port=8080
management.server.port=8081
spring.mvc.view.prefix=/
spring.mvc.view.suffix=.html

#环境激活
spring.profiles.active=publish 

平时直接运行的时候就会默认使用日常环境配置运行。

你可能感兴趣的:(运维相关,spring,boot,java,spring)