springboot指定profiles启动失败问题及解决
作者:Vince_YANG_94
springboot指定profiles启动失败
平常启动springboot的jar包, 都是通过–spring.profiles.active=dev, 即可读取application-dev.yml的配置文件的信息,进行启动
凡事总有意外
这次启动就很奇怪了, 输入这个启动环境参数, 依然不起效果,
就是这么惊悚, 就是这么意外!
没有读取application-dev.yml而是读取默认的application.yml文件
但是, 使用jvm的启动参数: java -jar -Dspring.profiles.active=dev, 可以启动, 证明dev的配置文件是有效的
比较其他项目
application的入口类发现:
public static void main(String[] args){ SpringApplication.run(Application.class,args); }
调用run方法的时候, 没有传入args!
阅读源码发现, 传入启动参数, 再解析传入参数,对properties进行设置
注意:
细心细心, 启动代码需要传入启动参数!!! 方能在启动时,输入启动参数生效
springboot Profiles、配置文件加载优先级
SpringBoot允许我们有多个配置文件,然后在项目启动时根据条件动态去加载对应的配置文件。
现在有三个配置,一个默认配置文件(application.properties:因为是SpringBoot指定的名字,所以叫默认配置文件),两个指定环境配置文件(application-prod.properties和application-dev.properties:和对应的环境有关,所以叫它们指定环境配置文件)
application-dev.properties
模拟开发配置信息
person.name=ZhangSan person.age=18
application-prod.properties
就模拟生产配置信息
person.name=LiSi person.age=19
application.properties
就指定一个服务的端口号和工程在启动的时候需要加载的配置文件,SpringBoot会自动去匹配application-{spring.profiles.active}.properties,然后就会找到application-dev.properties配置文件
server.port=8080 spring.profiles.active=dev #我们可以指定SpringBoot在启动时加载那个对应的配置文件
事例代码
创建了一个事例Person类,让它被实例化的时候从配置文件中读取信息,读取规则:person.{属性名},让把创建new一个Person的实例,添加到IOC容器中。
创建一个get请求,返回我们的Person的事例,我们看perosn的属性值能否根据我们在application.properties配置文件中指定spring.profiles.active的属性加载对应的配置文件,Person实例中的值是不是预期值
@ConfigurationProperties(prefix = "person") //初始化的时候从配置文件中读取person.{属性名}的信息赋值给当前对象 @Data public class Person { private String name; private Integer age; } @Configuration //配置文件信息,将Person实例注入到IOC容器中 public class MyConfig { @Bean public Person person() { return new Person(); } }
@RestController //创建一个get请求,返回我们的Person的事例,我们看perosn的属性值能否根据我们在application.properties配置文件中指定spring.profiles.active的属性加载对应的配置文件,Person实例中的值是不是预期值
@RequestMapping("/user") public class PersonController { @Autowired private Person person; @GetMapping public Person getPerson() { return person; } }
工程跑起来,访问http://localhost:8080/user,返回结果:
{"name":"ZhangSan","age":18}
把application.properties中的spring.profiles.active的值修改成prod,请求访问http://localhost:8080/user,返回结果:
{"name":"LiSi","age":19}
另外如果我们已经将工程打包成jar,可以在启动SpringBoot工程的时候,通过命令行给参数赋值的方式指定spring.profiles.active的值
java -jar .\web-02-0.0.1-SNAPSHOT.jar --spring.profiles.active=dev
还有一个比较实用的,就是SpringBoot默认加载application.properties和application.yaml的路径和优先级(从SpringBoot官方文档中看到的:https://docs.spring.io/spring-boot/docs/current/reference/html/features.html#features.external-config.application-json),加载的优先级:
- jar包所在的目录下面的/config/{一级子目录}下面的application.properties和application.yaml
- jar包所在的目录下面的/config下面的application.properties和application.yaml
- jar包所在的目录下面的application.properties和application.yaml
- classpath下面/config里面的application.properties和application.yaml
- classpath下面的application.properties和application.yaml
场景就是:我们的项目跑了很久了,突发情况需要修改配置文件。但是以前的老配置文件我们也不敢随意修改,这个时候我们就可以在优先级高的地方放我们的新的配合文件了。
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。