springboot系列:springboot项目在多环境下配置
任何一种技术的出现,都是来解决特定的问题的!
问题场景:
在一个项目中总会有不同的环境,开发环境、测试环境、生产环境、各个服务器的部署环境,不同的环境会有不同的配置,比如数据库的配置就不同、redis的配置就不同等,现在需要做到:不用每次换环境的时候,都去修改这些配置。
本人知道的解决方案方式有三种:
- 修改配置文件
- 命令启动服务,命令中带有环境的参数
- 第一种的优化版(常用)
解决方式:
方式一:修改配置文件
这样,springboot项目在启动服务的时候会有先读取application.properties
里面的内容,当读取到spring.profiles.active
时,会调取对应的参数后面的值的application_xx.properties
,上图中,启动服务时,会调取application_local.properties
文件,对应不同的环境,配置不同的文件,例如:application_dev.properties
,application_test.properties
方式二:命令启动服务,命令中带有环境的参数
注意:该方式可以没有application.properties文件
- cmd进入到项目的目录下,进行maven打包,执行命令:mav install,会在target目录下生成项目的jar包。
- 进入target目录,执行命令:java -jar 生成的jar包 --spring.profiles.active=local
项目会调用application_dev.properties
的配置文件。同理,若是测试环境,只需将local该成test
方式三:第一种的优化版(常用)
application.properties
中填写[email protected]@
,这里的@profiles.active@是一个变量对应pom文件里的环境配置。
pox.xml的配置文件
<profiles>
<profile>
<!-- 本地开发环境(默认使用) -->
<id>local</id>
<properties>
<profiles.active>local</profiles.active>
</properties>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
</profile>
<profile>
<!-- 开发环境 -->
<id>beta</id>
<properties>
<profiles.active>beta</profiles.active>
</properties>
</profile>
<profile>
<!-- 测试环境 -->
<id>test</id>
<properties>
<profiles.active>test</profiles.active>
</properties>
</profile>
<profile>
<!-- stg环境 -->
<id>stg</id>
<properties>
<profiles.active>stg</profiles.active>
</properties>
</profile>
<profile>
<!-- 生产环境 -->
<id>prod</id>
<properties>
<profiles.active>prod</profiles.active>
</properties>
</profile>
</profiles>
在pom文件里分别配置好不同环境的文件名称。
注意:
<profiles.active>local</profiles.active>中的local与配置文件名称application-> local.properties要一致。
profiles.active名称对应application.properties配置文件中的[email protected]@。
当maven打包时会用pom文件里 <profiles.active>local</profiles.active> 中的值替换掉application.properties配置文件中的@profiles.actives@。
maven打包
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
<excludes>
<exclude>config/application.properties</exclude>
<exclude>config/application-local.properties</exclude>
<exclude>config/application-beta.properties</exclude>
<exclude>config/application-test.properties</exclude>
<exclude>config/application-stg.properties</exclude>
<exclude>config/application-prod.properties</exclude>
</excludes>
</resource>
<resource>
<!-- 配置需要被替换的资源文件路径 -->
<directory>src/main/resources</directory>
<includes>
<include>config/application-${profiles.active}.properties</include>
<include>config/application.properties</include>
</includes>
<filtering>true</filtering>
</resource>
<resource>
<directory>lib</directory>
<targetPath>BOOT-INF/lib/</targetPath>
<includes>
<include>**/*.jar</include>
</includes>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<finalName>${project.name}</finalName>
<mainClass>com.xxxx.Application</mainClass>
<jvmArguments>-Dfile.encoding=UTF-8</jvmArguments>
<includeSystemScope>true</includeSystemScope>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
<compilerArguments>
<extdirs>${pom.basedir}/lib</extdirs>
</compilerArguments>
</configuration>
</plugin>
<plugin>
<groupId>org.projectlombok</groupId>
<artifactId>lombok-maven-plugin</artifactId>
<version>1.18.0.0</version>
</plugin>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<finalName>${project.name}</finalName>
<!-- not append assembly id in release file name -->
<appendAssemblyId>false</appendAssemblyId>
<descriptors>
<descriptor>src/main/assembly/assembly.xml</descriptor>
</descriptors>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
配置完成,使用maven命令进行打包,mvn clean package -P local,target会生成jar包。
以上项目是本人项目中使用的配置,请根据配置进行更改。
springboot系列尚未完成,后续会一点补充