1、yml文件配置

  1. spring:
  2. datasource: # 数据库四大组件
  3. schema-password: root
  4. data-username: root
  5. driver-class-name: com.mysql.jdbc.Driver
  6. url: jdbc:mysql://localhost:3306/blogs?serverTimezone=UTC
  7. server: #设置tomcat
  8. port: 8888 #设置tomcat的端口号
  9. servlet:
  10. context-path: /springboot # 设置项目启动的根目录,这里面必须加上‘/’不然项目无法启动
  11. tomcat:
  12. uri-encoding: utf-8 #设置编码格式
  13. ---
  14. # 开发配置
  15. spring:
  16. profiles: dev #设置开发环境
  17. server:
  18. port: 8081
  19. ---
  20. # 生产配置
  21. spring:
  22. profiles: prod #设置生产环境
  23. server:
  24. port: 9000

这里,我对开发配置和生产环境做了配置。上面的配置是公共配置,下面我们分别配置了开发和生产的配置。spring.profiles表示配置的名称,spring.profiles.active表示要激活的环境,值和要切换的spring.profiles名称一致。上面这个文件,默认激活的就是dev开发配置。
如果spring.profiles.active没有指定值,那么只会加载通用的配置。

2、启动配置选择

工程打成jar包后,我们可以在运行的时候对配置进行选择,而不需要每次打包前都手动去修改spring.profiles.active的值。
例如在开发环境,我们可以使用dev配置执行jar包,命令如下:

  1. java -jar xxx.jar --spring.profiles.active=dev

同样在生产环境,我们可以使用prod配置执行jar包,命令如下:

  1. java -jar xxx.jar --spring.profiles.active=prod

3、将yml文件拆分多个文件

开发环境 application-dev.yml

  1. # 开发配置
  2. spring:
  3. datasource: # 数据库四大组件
  4. schema-password: root
  5. data-username: root
  6. driver-class-name: com.mysql.jdbc.Driver
  7. url: jdbc:mysql://localhost:3306/blogs?serverTimezone=UTC
  8. server: #设置tomcat
  9. port: 8020 #设置tomcat的端口号
  10. servlet:
  11. context-path: /springboot # 设置项目启动的根目录,这里面必须加上‘/’不然项目无法启动
  12. tomcat:
  13. uri-encoding: utf-8 #设置编码格式

生产环境 application-prod.yml

  1. # 生产配置
  2. spring:
  3. datasource: # 数据库四大组件
  4. schema-password: root
  5. data-username: root
  6. driver-class-name: com.mysql.jdbc.Driver
  7. url: jdbc:mysql://localhost:3306/blogs?serverTimezone=UTC
  8. server: #设置tomcat
  9. port: 8010 #设置tomcat的端口号
  10. servlet:
  11. context-path: /springboot # 设置项目启动的根目录,这里面必须加上‘/’不然项目无法启动
  12. tomcat:
  13. uri-encoding: utf-8 #设置编码格式

4、用Maven控制默认配置

在打包的时候,通过自动改变spring.profiles.active的激活配置,这样直接通过java -jar xxx.jar即可运行项目。现在的项目上线一般采用自研运维系统,默认是直接执行jar、war包的,不能在启动时选择配置,所以在打包时如果能自动将spring.profiles.active配置动态切换就可以了。
那如何实现呢?这里我们需要使用maven-resources-plugin插件。
在pom.xml添加如下配置

  1. <profiles>
  2. <!-- 开发环境 -->
  3. <profile>
  4. <id>dev</id>
  5. <properties>
  6. <spring.profiles.active>dev</spring.profiles.active>
  7. </properties>
  8. <activation>
  9. <activeByDefault>true</activeByDefault>
  10. </activation>
  11. </profile>
  12. <!-- 生产环境 -->
  13. <profile>
  14. <id>prod</id>
  15. <properties>
  16. <spring.profiles.active>prod</spring.profiles.active>
  17. </properties>
  18. </profile>
  19. </profiles>

在< plugins/>里添加,当然 pom.xml 需要添加以下依赖

  1. <!-- https://mvnrepository.com/artifact/org.apache.maven.plugins/maven-resources-plugin -->
  2. <dependency>
  3. <groupId>org.apache.maven.plugins</groupId>
  4. <artifactId>maven-resources-plugin</artifactId>
  5. <version>3.0.2</version>
  6. </dependency>
  1. <plugin>
  2. <groupId>org.apache.maven.plugins</groupId>
  3. <artifactId>maven-resources-plugin</artifactId>
  4. <version>3.0.2</version>
  5. <executions>
  6. <execution>
  7. <id>default-resources</id>
  8. <phase>validate</phase>
  9. <goals>
  10. <goal>copy-resources</goal>
  11. </goals>
  12. <configuration>
  13. <outputDirectory>target/classes</outputDirectory>
  14. <useDefaultDelimiters>false</useDefaultDelimiters>
  15. <delimiters>
  16. <delimiter>#</delimiter>
  17. </delimiters>
  18. <resources>
  19. <resource>
  20. <directory>src/main/resources/</directory>
  21. <filtering>true</filtering>
  22. </resource>
  23. <resource>
  24. <directory>src/main/resources.${spring.profiles.active}</directory>
  25. <filtering>false</filtering>
  26. </resource>
  27. </resources>
  28. </configuration>
  29. </execution>
  30. </executions>
  31. </plugin>

这里<delimiter>#</delimiter>用来增加一个占位符,Maven本身有占位符${xxx},但这个占位符被SpringBoot占用了,所以我们就再定义一个。<filtering>true</filtering>表示打开过滤器开关,这样application.yml文件中的#spring.profiles.active#部分就会替换为pom.xml里profiles中定义的 spring.profiles.active变量值。
最后,将application.yml的spring.profiles.active的值改为#spring.profiles.active#

  1. # 默认使用配置
  2. spring:
  3. profiles:
  4. active: #spring.profiles.active#

这样,在用maven打包的时候,使用mvn package -P prod打包,最后打包后的文件中,application.yml中的spring.profiles.active的值就是prod。这样直接运行java -jar xxx.jar,就是生产环境的配置了。
以上就是SpringBoot + Maven实现多环境动态切换yml配置及配置文件拆分。

SpringBoot内置tomcat依赖:

  1. <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-tomcat -->
  2. <dependency>
  3. <groupId>org.springframework.boot</groupId>
  4. <artifactId>spring-boot-starter-tomcat</artifactId>
  5. <version>2.1.3.RELEASE</version>
  6. </dependency>

此外tomcat的配置文件属性还有以下:

  1. server. Port = xxxx
  2. server. Address =
  3. server. contextPath =
  4. server. displayName =
  5. server. servletPath =
  6. server. contextParameters =
  7. server. useForwardHeaders =
  8. server. serverHeader =
  9. server. maxHttpHeaderSize =
  10. server. maxHttpPostSize =
  11. server. connectionTimeout =
  12. server. session.timeout =
  13. server. session.trackingModes =
  14. server. session.persistent =
  15. server.session.storeDir =
  16. server.cookie. name =
  17. server.cookie. domain =
  18. server.cookie. path =
  19. server.cookie. comment =
  20. server.cookie. httpOnly =
  21. server.cookie. secure =
  22. server.cookie. maxAge =
  23. server. ssl. Enabled =
  24. server.ssl. clientAuth =
  25. server.ssl. ciphers =
  26. server.ssl. enabledProtocols =
  27. server.ssl. keyAlias =
  28. server.ssl. keyPassword =
  29. server.ssl. keyStore =
  30. server.ssl. keyStorePassword =
  31. server.ssl. keyStoreType =
  32. server.ssl. keyStoreProvider =
  33. server.ssl. trustStore =
  34. server.ssl. trustStorePassword =
  35. server.ssl. trustStoreType =
  36. server.ssl. trustStoreProvider =
  37. server.ssl. protocol =
  38. server.compression. enabled =
  39. server.compression.mimeTypes =
  40. server.compression.excludedUserAgents =
  41. server.compression.minResponseSize =
  42. server. jspServlet. className =
  43. server.jspServlet. initParameters =
  44. server.jspServlet.registered =
  45. server.tomcat.accesslog.enabled =
  46. server.tomcat.accesslog.pattern =
  47. server.tomcat.accesslog.directory =
  48. server.tomcat.accesslog.prefix =
  49. server.tomcat.accesslog.suffix =
  50. server.tomcat.accesslog.rotate =
  51. server.tomcat.accesslog.renameOnRotate =
  52. server.tomcat.accesslog.requestAttributesEnabled=
  53. server.tomcat.accesslog.buffered =
  54. server.tomcat.internalProxies =
  55. server.tomcat.protocolHeader =
  56. server.tomcat.protocolHeaderHttpsValue =
  57. server.tomcat.portHeader =
  58. server.tomcat.remoteIpHeader=
  59. server.tomcat.basedir =
  60. server.tomcat.backgroundProcessorDelay =
  61. server.tomcat.maxThreads =
  62. server.tomcat.minSpareThreads =
  63. server.tomcat.maxHttpPostSize =
  64. server.tomcat.maxHttpHeaderSize =
  65. server.tomcat.redirectContextRoot =
  66. server.tomcat.uriEncoding =
  67. server.tomcat.maxConnections =
  68. server.tomcat.acceptCount =
  69. server.tomcat.additionalTldSkipPatterns =

注意:可以在yml文件中修改tomcat的各个配置,比如端口号或者线程数等。