Springboot读取外部配置文件,项目部署时配置读取不到问题及解决

 更新时间:2024年06月11日 15:22:36   作者:蓝天白云下遛狗  
这篇文章主要介绍了Springboot读取外部配置文件,项目部署时配置读取不到问题及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

需求

最近项目部署,但是每个地方都有个别地方配置的差异,我们每次打包后再进行修改极度不方便,这里将有关的配置都抽取出来,放在jar包外进行配置,这样以后更新时只需要将jar包更换然后重启即可,配置读取外部的固定配置文件。

SpringBoot 配置

springboot默认配置的加载位置和优先级顺序

springboot启动时会扫描以下位置的application.properties和application.yml文件作为默认的配置文件。

  • file: ./config/
  • file: ./
  • classpath: /config/
  • classpath: /

所有的配置文件都会被加载,但高优先级的配置会覆盖低优先的配置,上面的优先级为由高到低排列,./config/ 的优先级最高,我们创建项目时默认的放在resources目录下的优先级是最低的。

classpath可以理解为我们项目内部的没打包时的resources文件夹下的,file理解为和jar包同级的目录(如果在linux中启动项目时写的启动路径的相对位置和file的文件不是同级时外部配置文件会出现读取失败,可以翻到文章最下面)。

配置文件中带spring.profile的文件会优先被加载

启动项目时指定配置文件的位置

java -jar xxxx.jar -Dspring.config.location=/home/test/application.yml

启动时加载/home/test文件夹下的application.yml作为配置文件。

这里还可以指定端口、生效的配置文件、日志打印等

java -jar xxxx.jar -Dspring.profiles.active=prod -Dspring.config.location=/home/test/application.yml
-Dserver.port=8081  > logs/xxxlog.log 2>&1 &

application配置

  • 非默认配置文件,这里我是config.properties

可以通过注解_@PropertySource_ 来指定配置文件的位置,value中提供两种方式 classpath 和 file

@Configuration
@ConfigurationProperties(prefix = "config", ignoreUnknownFields = false)
@PropertySource(name = "config.properties"
        ,value = {"classpath:/config.properties","file:./config/config.properties"}
        ,ignoreResourceNotFound = true
        ,encoding = "UTF-8")

value是一个数组,可以放多个配置文件,从左到右进行加载,后面的会覆盖掉前面的配置,ignoreResourceNotFound = true主要用来忽略文件不存在的情况,如果第一个目录下没有找到对应的文件内容,就向后继续找不加这个配置第一个文件找不到时会报错。

ConfigurationProperties 是用来减少下面@Value注解的参数,如果不加这个注解,配置项中配置的是 config.username = 'liuch’
这时你的@Value(“config.maintType" ) 需要写完整,如果配置了以后 @Value("{config.maintType}")需要写完整,如果配置了以后@Value("config.maintType")需要写完整,如果配置了以后@Value("{maintType}”)即可。

部署时配置读取失败

注意: 在linux启动项目时,config文件夹要和启动根目录的相对路径是同一级,否则读取不到配置,需要在启动项目时指定配置文件位置。

例:

现在jar和config放在 /home/liuch/app/ 文件夹下,我们启动时需要先进入到 /home/liuch/app 目录,然后再
nohup java -jar xxx.jar >/dev/null 2>&1 &,直接使用命令nohup java -jar /home/liuch/app/xxx.jar >/dev/null 2>&1 & 启动时不会去读取config文件夹下的配置文件,需要使用-Dspring.config.location= 指定配置文件位置,此时我们的非默认配置文件是读取不到的,我们可以在application.yml文件中配置需要加载的非默认配置文件位置

server:
  port: 8088
config:
  path: /home/liuch/config.properties
@PropertySource(value = {"file:${config.path}"}, encoding="utf-8")

下面的@Value的用法和之前一样。

附:

springboot项目启动时的参数

/usr/local/java/jdk1.8.0_131/bin/java -jar -server -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/data/spb_zcmweb/8103/dump/heap/
 -Djava.io.tmpdir=/data/liuch/tmp/ 
 -Dserver.port=8103 
 -Dcom.sun.management.jmxremote
 -Dcom.sun.management.jmxremote.port=5103 
 -Dcom.sun.management.jmxremote.rmi.port=6103 
 -Dcom.sun.management.jmxremote.authenticate=false 
 -Dcom.sun.management.jmxremote.ssl=false 
 -Dcom.sun.management.jmxremote.access.file=/usr/local/java/jdk1.8.0_131/jre/lib/management/jmxremote.access 
 -Xmx2G -Xms2G -XX:+DisableExplicitGC -verbose:gc -Xloggc:/data/liuch/log/gc.%t.log -XX:+PrintHeapAtGC -XX:+PrintTenuringDistribution -XX:+PrintGCApplicationStoppedTime -XX:+PrintGCTaskTimeStamps -XX:+PrintGCDetails -XX:+PrintGCDateStamps 
 -Dserver.connection-timeout=60000 
 -Dserver.tomcat.accept-count=1000 
 -Dserver.tomcat.max-threads=300 
 -Dserver.tomcat.min-spare-threads=65 
 -Dserver.tomcat.accesslog.enabled=false 
 -Dserver.tomcat.accesslog.directory=/data/liuch/log/ 
 -Dserver.tomcat.accesslog.prefix=access_log 
 -Dserver.tomcat.accesslog.pattern=combine 
 -Dserver.tomcat.accesslog.suffix=.log 
 -Dserver.tomcat.accesslog.rotate=true 
 -Dserver.tomcat.accesslog.rename-on-rotate=true 
 -Dserver.tomcat.accesslog.request-attributes-enabled=true 
 -Dserver.tomcat.accesslog.buffered=true 
 -XX:NewRatio=4 -XX:SurvivorRatio=30 -XX:TargetSurvivorRatio=90 -XX:MaxTenuringThreshold=8 -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=70 -XX:ParallelGCThreads=24 -XX:ConcGCThreads=24 -XX:-UseGCOverheadLimit -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:CMSFullGCsBeforeCompaction=1 -XX:+CMSParallelRemarkEnabled -XX:+CMSScavengeBeforeRemark -XX:+ParallelRefProcEnabled -XX:+UseCMSCompactAtFullCollection -XX:CMSMaxAbortablePrecleanTime=6000 -XX:CompileThreshold=10 -XX:MaxInlineSize=1024 -Dsun.net.client.defaultConnectTimeout=60000 
 -Dsun.net.client.defaultReadTimeout=60000 
 -Dnetworkaddress.cache.ttl=300 -Dsun.net.inetaddr.ttl=300 
 -Djsse.enableCBCProtection=false 
 -Djava.security.egd=file:/dev/./urandom 
 -Dfile.encoding=UTF-8 
 -Dlog.path=/data/liuch/log/ 
 -Dspring.profiles.active=online  
 /data/liuch/deploy/xxxx.jar zcmweb 

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • @ConfigurationProperties注解原理与实践方式

    @ConfigurationProperties注解原理与实践方式

    这段文章详细介绍了@ConfigurationProperties在SpringBoot中的使用方法,并探讨了其源码实现原理,进而引导读者自己实现类似功能,涵盖配置文件解析、Bean生命周期管理等内容,同时强调了通过学习SpringBoot源码来实现自定义功能的重要性
    2026-06-06
  • SSM项目使用拦截器实现登录验证功能

    SSM项目使用拦截器实现登录验证功能

    这篇文章主要介绍了在SSM项目中如何使用拦截器,实现登录验证功能。文中的实现步骤讲解详细,感兴趣的小伙伴可以了解一下
    2022-01-01
  • Mybatis配置解析看这一篇就够了

    Mybatis配置解析看这一篇就够了

    这篇文章主要介绍了详解Mybatis是如何解析配置文件的,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-07-07
  • 自己写的简易版Java日志类分享

    自己写的简易版Java日志类分享

    这篇文章主要介绍了自己写的简易版Java日志类分享,本文直接给出实现代码,需要的朋友可以参考下
    2015-06-06
  • Java Character类的应用场景

    Java Character类的应用场景

    Java中的Character类提供了处理单个字符的静态方法和实例方法,包括大小写转换、比较、分类等,它在处理用户输入、排序、查找和文本分类等场景中非常有用,下面就来详细的介绍一下如何应用,感兴趣的可以了解一下
    2026-01-01
  • Spring实战之XML与JavaConfig的混合配置详解

    Spring实战之XML与JavaConfig的混合配置详解

    大家都知道Spring的显示配置方式有两种,一种是基于XML配置,一种是基于JavaConfig的方式配置。那么下这篇文章主要给大家分别介绍如何在JavaConfig中引用XML配置的bean以及如何在XML配置中引用JavaConfig,需要的朋友可以参考下。
    2017-07-07
  • springboot整合JSR303校验功能实现代码

    springboot整合JSR303校验功能实现代码

    这篇文章主要介绍了springboot整合JSR303校验功能实现,JSR303校验方法有统一校验的需求,统一校验实现以及分组校验,本文结合实例代码给大家介绍的非常详细,需要的朋友可以参考下
    2023-01-01
  • SpringBean实例化的基本流程源码剖析

    SpringBean实例化的基本流程源码剖析

    Spring容器通过BeanDefinition对象和singletonObjects Map集合管理Bean实例化过程,实现依赖注入和控制反转,本文给大家介绍SpringBean实例化的基本流程源码剖析,感兴趣的朋友跟随小编一起看看吧
    2026-01-01
  • 浅谈一下数据库连接池Druid德鲁伊

    浅谈一下数据库连接池Druid德鲁伊

    数据库连接池就是一个容器持有多个数据库连接,当程序需要操作数据库的时候直接从池中取出连接,使用完之后再还回去,和线程池一个道理,需要的朋友可以参考下
    2023-05-05
  • 关于springboot 配置date字段返回时间戳的问题

    关于springboot 配置date字段返回时间戳的问题

    这篇文章主要介绍了springboot 配置date字段返回时间戳的问题,在springboot2.0后,spring会将Date字段自动给转成UTC字符串了(在没有配置的情况下),所以date需要转换成时间戳还是yyyy-MM-dd HH:mm:ss,具体解决方法跟随小编一起看看吧
    2021-07-07

最新评论