一、初步,使用多个配置文件
我们在使用Springboot时,springboot默认会获取classpath根目录下的application.properties和application.yml,由于开发、内测、用户测试、生产等各种环境需要有不同的配置文件,可以根据需要新建多个配置文件来区分环境
-
新建不同环境的application.yml文件
image.png 我们在不同的文件中自定义配置一些参数
主配置里是共用的参数,不需要切换环境的放在application.yml中:
server:
port: 8384
servlet:
context-path: /
my:
info:
travel: ship
application-bar.yml中:
my:
info:
name: Jack
application-foo.yml中:
my:
info:
name: Rose
- Controller中使用自定义参数
@SpringBootApplication
@RestController
public class ProfilesApplication {
@Value("${my.info.name}")
private String name;
@Value("${my.info.travel}")
private String travel;
@GetMapping("/info")
public String info(){
String text = "Hi,My name's " + name + ", and I'm like go to travel by " + travel + ".";
return text;
}
public static void main(String[] args) {
SpringApplication.run(ProfilesApplication.class, args);
}
}
- jar包运行,使用参数来告诉springboot使用对应的配置文件
$ mvn clean package
$ java -jar -Dspring.profiles.active=foo ./target/profile.jar
停止服务,切换环境至bar运行
$ java -jar -Dspring.profiles.active=bar ./target/profile.jar
- war包部署到外置tomcat中
需要将环境配置文件,显示的声明到主配置文件中,打war包时,需要修改主配置文件application.yml的spring.profiles.active
server:
port: 8384
servlet:
context-path: /
my:
info:
travel: ship
spring:
profiles:
active: foo
二、打包时,使用参数来切换不同配置文件
很多时候,我们在开发项目中是由多人团队协作,经常的修改主配置文件就容易让本地的源码改动提交到项目远程仓库,因此在打包时能够使用参数来区分环境显得尤为重要
- 在pom.xml中添加<profile></profile>标签来定义环境
<profiles>
<profile>
<id>foo</id>
<properties>
<profileActive>foo</profileActive>
</properties>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
</profile>
<profile>
<id>bar</id>
<properties>
<profileActive>bar</profileActive>
</properties>
</profile>
</profiles>
其中properties标签下的profileActive使我们自定义的节点,我们可以在配置文件中直接引用该节点中的值,< activation>的<activeByDefault>告诉打包时,默认使用的参数值
- 主配置文件application.yml中,修改spring.profiles.active
server:
port: 8384
servlet:
context-path: /
my:
info:
travel: ship
spring:
profiles:
active: @profileActive@
profileActive就是我们自定义的节点,在打包时可以替换为对应的环境名称
- 修改pom.xml打包时插件的分隔符为@
告诉maven插件以哪个特殊符号为准,我们配置maven-resources-plugin
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<configuration>
<delimiters>@</delimiters>
<useDefaultDelimiters>false</useDefaultDelimiters>
</configuration>
</plugin>
- pom.xml中定义资源,maven插件打包时,可以知道哪些文件需要做profile的替换,对需要替换的文件进行配置
<resources>
<resource>
<directory>${project.basedir}/src/main/resources</directory>
<filtering>true</filtering>
<includes>
<include>application.yml</include>
<include>application-${profileActive}.yml</include>
</includes>
<excludes>
<exclude>db/**</exclude>
<exclude>static/**</exclude>
<exclude>templates/**</exclude>
</excludes>
</resource>
<resource>
<directory>${project.basedir}/src/main/resources</directory>
<filtering>false</filtering>
<includes>
<include>db/**</include>
<include>static/**</include>
<include>templates/**</include>
</includes>
<excludes>
<exclude>application*.yml</exclude>
</excludes>
</resource>
</resources>
filtering为true时,编译时,会对含有@@的符号内容进行替换,可以看到,这个地方我写了2个,1个是除除application之外的资源文件,另一个是application的配置文件。其他资源如果被maven-resources-plugin过滤过,会造成页面资源或者其他配置文件的错误,因此一定要配置2个<resource>
- mave打包使用参数
假如我们希望使用bar参数来打包
$ mvn clean package -P bar
$ java -jar ./target/profile.jar
启动后日志刷出来的配置:
验证一下,请求 http://localhost:8384/info
三、总结
该解决方案对IDE友好,不用修改配置文件,保证了代码版本不乱提交,建议把开发环境设置为默认,如果在开发工具中切换,可以在maven边栏中修改