知识点8--spring boot配置文件相关

本编介绍的是spring boot默认配置文件,因为它不止可以有一个,在springboot开发中标准情况下生效的配置是默认的application.properties,但一般情况下,我们会应对不同的运行环境准备不同的配置文件,而其他的配置文件标准的命名规则为application-配置文件名.properties,这个时候就需要知道,如何让spring boot加载到正确的配置文件

比如我现在多了一个测试用的配置文件application-test.properties,我想在本地开发的时候使用该文件启动spring boot项目,那就可以在默认配置文件第一行添加spring.profiles.active配置,并将生效配置文件名设为该配置的值,这是一种默认的固定格式,一般在工作中也是遵守着这样的书写方式。

比如:

spring.profiles.active=test

我们用知识点7的项目,做一个演示,复制application.properties并重命名为application-test.properties文件,为了演示效果,我们将application.properties中的内容只保留spring.profiles.active=test配置,其他全部删除,大家自己写的时候可以不用删除,这里有个注意点见最后的特别说明,需要生效的application-test.properties配置文件不需要多做其他配置,保持原有的配置内容就行

在这里插入图片描述
在这里插入图片描述
此时我们重新编译一下项目并启动程序,我们会发现程序不报错,且项目运行正常
在这里插入图片描述

当然不止这一种方式,还有一种通过pom文件使用插件指定的,有兴趣的可以网上找找,但是个人不建议使用插件,因为插件毕竟属于第三方,而且修改后你还不能保证是否一定能生效,通常还需要编译,比较麻烦。


此外配置文件支持yml写法,其实就是本来一行能解决的,yml写法变成多行看的有层次感而已,且后缀名为yml,这种写法对格式上还有很多的细节问题,大家可以去网上了解一下这种格式,学习阶段不建议大家用这种格式,容易发生springboot还没学明白配置文件的书写又出问题的尴尬

在这里插入图片描述


在spring boot配置文件中,对于数据源有一个类型的设置

spring.datasource.type=com.zaxxer.hikari.HikariDataSource

我这里特别说明一下,这个配置一般情况下,我们只会使用HikariDataSource或者是阿里的DruidDataSource,其他的很少用,HikariDataSource是spring boot自带的,DruidDataSource需要下载阿里的依赖

本质上这个玩意和Mybatis的Sql工厂等价,它就是一种操作数据库的数据库连接池对象,不同的连接池,优点缺点也各不相同,这个就是看项目实际用的是那种


细心的人会发现我上面用了两个字眼标准默认,反过来就是说配置文件我们可以自定义,不需要遵守application.properties或者application-test.properties这种命名格式。

但是你要知道这种默认的标准命名存在原因,它存在的原因不止是springboot项目默认配置文件为application.properties,也是给了开发工具一种标准上的支持,就拿我们用的idea来说,idea默认识别application.properties文件并为我们的配置文件书写,提供提示。

下面来学习如何自定义配置文件。首先在resource下创建一个自定义的配置文件myapp.properties
在这里插入图片描述
观察自定义的配置文件会发现不止图标不一样,而且书写时没有提示,此时你需要做如下设置。

依次点击file-->projeck structure-->facets,在弹出的页面中点击spring中的配置文件图标
在这里插入图片描述
在弹出的页面中点击加号,在弹出的目录中选中自定义配置文件
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
点击OK保存退出,再次观察自定义配置文件,即可发现不止图标已经变为springboot配置文件图标,而且编辑时再次拥有了idea的提示支持

在这里插入图片描述

但是一般正式开发没有团队会用这种自定义配置文件名的手法,因为在多配置文件环境下,spring.profiles.active的值可能无法准确识别,都是遵循标准走


在springboot项目中,除了上面提到的不同分支配置文件共存、自定义配置名这两点之外,还有一点要知道,当我们开发出来的东西要给第三方使用时常常会遇到需要把开发出来的结果物二次封装为一个开箱即用的应用包,不知道大家有没有用过nacos,或者是使用其他技术的时候是否想过,那种只需要双击一个官方写好的启动脚本就可以使用程序了,这种开箱即用的应用包本质上就是springboot和java给我们提供了相关的扩展指令。

比如我之前做过一个给个人用的功能Demo项目,把它打包成开箱即用的应用包后目录是下面这个样子
在这里插入图片描述
我的配置文件并没有在结果jar中,而是在config中,而且为了减小结果jar的大小,我将用到的第三方jar都放在了lib中,当然这样做的前提是开发的项目中pom里的依赖范围都需要设置不打到结果jar中,jre是java的虚拟机资源,所以我的脚本内容如下

chcp 65001
set BASE_DIR=%~dp0
set CONFIG_DIR=%BASE_DIR%config\application.properties
set BIN=%BASE_DIR%jre\bin\java.exe -Djava.ext.dirs=%BASE_DIR%lib -jar %BASE_DIR%lib\worldmatter-2.2.2.jar -Dfile.encoding=utf-8 -Dspring.config.location=%CONFIG_DIR%
%BIN% 

大家可以用自己的项目试一试,很好用的,而且这样做可以对使用者提供友好的使用环境,毕竟用你结果jar的人不一定是一个有java环境的业内人士,就算有也不一定会不会版本冲突。

而且注意,如我上面的启动命令中-Djava.ext.dirs加载其他类库参数,必须在-jar参数之前,不然不起效果,-Dspring.config.location是springboot的默认配置文件路径,如果有多个配置文件,则必须和默认配置文件在同一路径下,会自动识别。chcp 65001-Dfile.encoding=utf-8如果你是在Windows上运行,则必须用要不然中文资源会出问题。


特别说明

最后要说一点spring.profiles.active所有配置文件全部算起来,也只能出现一次,甚至不能在不同的分支配置文件中在出现第二次,所以一般放在了默认的配置文件中用来生效不同的环境配置,但是在博文开始的时候将默认的配置文件中其他内容删除,是为了保证生效分支配置文件的演示效果,在正常使用下,其实默认的配置文件中是可以有其他内容的,不过当生效的分支文件中再次出现同样的配置时,分支文件中的配置会优先于默认配置文件生效

切记在不同文件中都配置了spring.profiles.active就会报如下错误,所以其他的配置都可以在不同文件中存在,但是唯独spring.profiles.active不行

D:\developtool\java_jdk1.8\bin\java.exe -XX:TieredStopAtLevel=1 -noverify -Dspring.output.ansi.enabled=always "-javaagent:D:\developtool\IntelliJ IDEA 2021.2.2\lib\idea_rt.jar=50940:D:\developtool\IntelliJ IDEA 2021.2.2\bin" -Dcom.sun.management.jmxremote -Dspring.jmx.enabled=true -Dspring.liveBeansView.mbeanDomain -Dspring.application.admin.enabled=true -Dfile.encoding=UTF-8 -classpath "D:\developtool\java_jdk1.8\jre\lib\charsets.jar;D:\developtool\java_jdk1.8\jre\lib\deploy.jar;D:\developtool\java_jdk1.8\jre\lib\ext\access-bridge-64.jar;D:\developtool\java_jdk1.8\jre\lib\ext\cldrdata.jar;D:\developtool\java_jdk1.8\jre\lib\ext\dnsns.jar;D:\developtool\java_jdk1.8\jre\lib\ext\jaccess.jar;D:\developtool\java_jdk1.8\jre\lib\ext\jfxrt.jar;D:\developtool\java_jdk1.8\jre\lib\ext\localedata.jar;D:\developtool\java_jdk1.8\jre\lib\ext\nashorn.jar;D:\developtool\java_jdk1.8\jre\lib\ext\sunec.jar;D:\developtool\java_jdk1.8\jre\lib\ext\sunjce_provider.jar;D:\developtool\java_jdk1.8\jre\lib\ext\sunmscapi.jar;D:\developtool\java_jdk1.8\jre\lib\ext\sunpkcs11.jar;D:\developtool\java_jdk1.8\jre\lib\ext\zipfs.jar;D:\developtool\java_jdk1.8\jre\lib\javaws.jar;D:\developtool\java_jdk1.8\jre\lib\jce.jar;D:\developtool\java_jdk1.8\jre\lib\jfr.jar;D:\developtool\java_jdk1.8\jre\lib\jfxswt.jar;D:\developtool\java_jdk1.8\jre\lib\jsse.jar;D:\developtool\java_jdk1.8\jre\lib\management-agent.jar;D:\developtool\java_jdk1.8\jre\lib\plugin.jar;D:\developtool\java_jdk1.8\jre\lib\resources.jar;D:\developtool\java_jdk1.8\jre\lib\rt.jar;D:\developtool\IntelliJ IDEA 2021.2.2\iedaobj\boot-jsp\target\classes;D:\developtool\apache-maven-3.8.5\rep\org\springframework\boot\spring-boot-starter-web\2.7.4\spring-boot-starter-web-2.7.4.jar;D:\developtool\apache-maven-3.8.5\rep\org\springframework\boot\spring-boot-starter\2.7.4\spring-boot-starter-2.7.4.jar;D:\developtool\apache-maven-3.8.5\rep\org\springframework\boot\spring-boot\2.7.4\spring-boot-2.7.4.jar;D:\developtool\apache-maven-3.8.5\rep\org\springframework\boot\spring-boot-autoconfigure\2.7.4\spring-boot-autoconfigure-2.7.4.jar;D:\developtool\apache-maven-3.8.5\rep\org\springframework\boot\spring-boot-starter-logging\2.7.4\spring-boot-starter-logging-2.7.4.jar;D:\developtool\apache-maven-3.8.5\rep\ch\qos\logback\logback-classic\1.2.11\logback-classic-1.2.11.jar;D:\developtool\apache-maven-3.8.5\rep\ch\qos\logback\logback-core\1.2.11\logback-core-1.2.11.jar;D:\developtool\apache-maven-3.8.5\rep\org\apache\logging\log4j\log4j-to-slf4j\2.17.2\log4j-to-slf4j-2.17.2.jar;D:\developtool\apache-maven-3.8.5\rep\org\apache\logging\log4j\log4j-api\2.17.2\log4j-api-2.17.2.jar;D:\developtool\apache-maven-3.8.5\rep\org\slf4j\jul-to-slf4j\1.7.36\jul-to-slf4j-1.7.36.jar;D:\developtool\apache-maven-3.8.5\rep\jakarta\annotation\jakarta.annotation-api\1.3.5\jakarta.annotation-api-1.3.5.jar;D:\developtool\apache-maven-3.8.5\rep\org\yaml\snakeyaml\1.30\snakeyaml-1.30.jar;D:\developtool\apache-maven-3.8.5\rep\org\springframework\boot\spring-boot-starter-json\2.7.4\spring-boot-starter-json-2.7.4.jar;D:\developtool\apache-maven-3.8.5\rep\com\fasterxml\jackson\core\jackson-databind\2.13.4\jackson-databind-2.13.4.jar;D:\developtool\apache-maven-3.8.5\rep\com\fasterxml\jackson\core\jackson-annotations\2.13.4\jackson-annotations-2.13.4.jar;D:\developtool\apache-maven-3.8.5\rep\com\fasterxml\jackson\core\jackson-core\2.13.4\jackson-core-2.13.4.jar;D:\developtool\apache-maven-3.8.5\rep\com\fasterxml\jackson\datatype\jackson-datatype-jdk8\2.13.4\jackson-datatype-jdk8-2.13.4.jar;D:\developtool\apache-maven-3.8.5\rep\com\fasterxml\jackson\datatype\jackson-datatype-jsr310\2.13.4\jackson-datatype-jsr310-2.13.4.jar;D:\developtool\apache-maven-3.8.5\rep\com\fasterxml\jackson\module\jackson-module-parameter-names\2.13.4\jackson-module-parameter-names-2.13.4.jar;D:\developtool\apache-maven-3.8.5\rep\org\springframework\boot\spring-boot-starter-tomcat\2.7.4\spring-boot-starter-tomcat-2.7.4.jar;D:\developtool\apache-maven-3.8.5\rep\org\apache\tomcat\embed\tomcat-embed-websocket\9.0.65\tomcat-embed-websocket-9.0.65.jar;D:\developtool\apache-maven-3.8.5\rep\org\springframework\spring-web\5.3.23\spring-web-5.3.23.jar;D:\developtool\apache-maven-3.8.5\rep\org\springframework\spring-beans\5.3.23\spring-beans-5.3.23.jar;D:\developtool\apache-maven-3.8.5\rep\org\springframework\spring-webmvc\5.3.23\spring-webmvc-5.3.23.jar;D:\developtool\apache-maven-3.8.5\rep\org\springframework\spring-aop\5.3.23\spring-aop-5.3.23.jar;D:\developtool\apache-maven-3.8.5\rep\org\springframework\spring-context\5.3.23\spring-context-5.3.23.jar;D:\developtool\apache-maven-3.8.5\rep\org\springframework\spring-expression\5.3.23\spring-expression-5.3.23.jar;D:\developtool\apache-maven-3.8.5\rep\org\slf4j\slf4j-api\1.7.36\slf4j-api-1.7.36.jar;D:\developtool\apache-maven-3.8.5\rep\org\springframework\spring-core\5.3.23\spring-core-5.3.23.jar;D:\developtool\apache-maven-3.8.5\rep\org\springframework\spring-jcl\5.3.23\spring-jcl-5.3.23.jar;D:\developtool\apache-maven-3.8.5\rep\org\apache\tomcat\embed\tomcat-embed-jasper\9.0.65\tomcat-embed-jasper-9.0.65.jar;D:\developtool\apache-maven-3.8.5\rep\org\apache\tomcat\embed\tomcat-embed-core\9.0.65\tomcat-embed-core-9.0.65.jar;D:\developtool\apache-maven-3.8.5\rep\org\apache\tomcat\tomcat-annotations-api\9.0.65\tomcat-annotations-api-9.0.65.jar;D:\developtool\apache-maven-3.8.5\rep\org\apache\tomcat\embed\tomcat-embed-el\9.0.65\tomcat-embed-el-9.0.65.jar;D:\developtool\apache-maven-3.8.5\rep\org\eclipse\jdt\ecj\3.18.0\ecj-3.18.0.jar;D:\developtool\apache-maven-3.8.5\rep\com\wy\communal\1.0\communal-1.0.jar;D:\developtool\apache-maven-3.8.5\rep\javax\servlet\jstl\1.2\jstl-1.2.jar" com.wy.bootjsp.BootJspApplication
18:58:14.573 [main] ERROR org.springframework.boot.SpringApplication - Application run failed
org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property 'spring.profiles.active' imported from location 'class path resource [application-dev.properties]' is invalid in a profile specific resource [origin: class path resource [application-dev.properties] - 1:24]
	at org.springframework.boot.context.config.InvalidConfigDataPropertyException.lambda$throwOrWarn$1(InvalidConfigDataPropertyException.java:125)
	at java.lang.Iterable.forEach(Iterable.java:75)
	at java.util.Collections$UnmodifiableCollection.forEach(Collections.java:1080)
	at org.springframework.boot.context.config.InvalidConfigDataPropertyException.throwOrWarn(InvalidConfigDataPropertyException.java:122)
	at org.springframework.boot.context.config.ConfigDataEnvironment.checkForInvalidProperties(ConfigDataEnvironment.java:361)
	at org.springframework.boot.context.config.ConfigDataEnvironment.applyToEnvironment(ConfigDataEnvironment.java:325)
	at org.springframework.boot.context.config.ConfigDataEnvironment.processAndApply(ConfigDataEnvironment.java:233)
	at org.springframework.boot.context.config.ConfigDataEnvironmentPostProcessor.postProcessEnvironment(ConfigDataEnvironmentPostProcessor.java:102)
	at org.springframework.boot.context.config.ConfigDataEnvironmentPostProcessor.postProcessEnvironment(ConfigDataEnvironmentPostProcessor.java:94)
	at org.springframework.boot.env.EnvironmentPostProcessorApplicationListener.onApplicationEnvironmentPreparedEvent(EnvironmentPostProcessorApplicationListener.java:102)
	at org.springframework.boot.env.EnvironmentPostProcessorApplicationListener.onApplicationEvent(EnvironmentPostProcessorApplicationListener.java:87)
	at org.springframework.context.event.SimpleApplicationEventMulticaster.doInvokeListener(SimpleApplicationEventMulticaster.java:176)
	at org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:169)
	at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:143)
	at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:131)
	at org.springframework.boot.context.event.EventPublishingRunListener.environmentPrepared(EventPublishingRunListener.java:85)
	at org.springframework.boot.SpringApplicationRunListeners.lambda$environmentPrepared$2(SpringApplicationRunListeners.java:66)
	at java.util.ArrayList.forEach(ArrayList.java:1257)
	at org.springframework.boot.SpringApplicationRunListeners.doWithListeners(SpringApplicationRunListeners.java:120)
	at org.springframework.boot.SpringApplicationRunListeners.doWithListeners(SpringApplicationRunListeners.java:114)
	at org.springframework.boot.SpringApplicationRunListeners.environmentPrepared(SpringApplicationRunListeners.java:65)
	at org.springframework.boot.SpringApplication.prepareEnvironment(SpringApplication.java:344)
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:302)
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1306)
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1295)
	at com.wy.bootjsp.BootJspApplication.main(BootJspApplication.java:10)

Process finished with exit code 1

最后要说的一点是,spring boot配置文件有四个默认路径,分别是代码的根路径也就是src下、src下自建config目录、resource下、resource下自建config目录,这一点知道就行了,因为一般没有谁再去调这个路径,都用的是创建项目时默认的resource下,或者是运行时指定jar包外的配置文件。

到此本篇知识点讲解结束,此外 本次整体讲解的spring boot项目已上传github

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值