SpringBoot配置加载顺序和SpringBoot分离打包:将jar包与lib依赖、配置文件分开

文章目录

  • 一、SpringBoot配置加载顺序
    • 1.SpringBoot配置优先级
      • (1)命令行参数
      • (2)配置文件
  • 二、SpringBoot分离打包:将jar包与lib依赖、配置文件分开
    • 1.pom文件配置
    • 2.打包后的目录结构


一、SpringBoot配置加载顺序

  • 官方文档
  • SpringBoot 允许在代码之外,提供应用程序运行的数据,以便在不同的环境中使用相同的应用程序代码。避免硬编码,提供系统的灵活性。可使用各种外部配置源,包括 配置文件环境变量命令行参数

1.SpringBoot配置优先级

  • 以下是常用的Spring Boot 配置形式及其加载顺序(优先级由高到低):
    • ① 命令行参数
    • ② 来自 java.comp/envJNDI 属性
    • ③ Java 系统属性(System.getProperties()
    • ④ 操作系统环境变量
    • RandomValuePropertySource 配置的 random.* 属性值
    • ⑥ 配置文件(YAML文件、Properties 文件)
    • @Configuration 注解类上的 @PropertySource 指定的配置文件
    • ⑧ 通过SpringApplication.setDefaultProperties 指定的默认属性
  • 以上所有形式的配置都会被加载,当存在相同配置内容时,高优先级的配置会覆盖低优先级的配置;存在不同的配置内容时,高优先级和低优先级的配置内容取并集,共同生效,形成互补配置。

(1)命令行参数

  • Spring Boot 中的所有配置,都可以通过命令行参数进行指定,其配置形式如下。
java -jar {Jar文件名} --{参数1}={参数值1} --{参数2}={参数值2}
例如:java -jar olive-0.1.jar --server.port=8800 --server.servlet.context-path=/olive

(2)配置文件

  • Spring Boot 启动时,会自动加载 JAR 包内部及 JAR 包所在目录指定位置的配置文件(Properties 文件、YAML 文件),下图中展示了 Spring Boot 自动加载的配置文件的位置及其加载顺序,同一位置下,Properties 文件优先级高于 YAML 文件。
  • springboot 启动会扫描以下位置的application.properties或者application.yml文件作为Spring boot的默认配置文件
    • ① Jar包外同级目录的config目录
    • ② Jar包外同级目录
    • ③ jar包内classPath(即resources目录)的config目录
    • ④ jar包内的classpath目录
  • 配置文件的优先级顺序,遵循以下规则:
    • ① 先加载 JAR 包外的配置文件,再加载 JAR 包内的配置文件;
    • ② 先加载 config 目录内的配置文件,再加载 config 目录外的配置文件;
    • ③ 先加载 config 子目录下的配置文件,再加载 config 目录下的配置文件
    • ④ 先加载 appliction-{profile}.properties/yml,再加载application.properties/yml;
    • ⑤ 先加载 .properties 文件,再加载 .yml 文件。

二、SpringBoot分离打包:将jar包与lib依赖、配置文件分开

  • 之前一直使用SpringBoot初始化建立项目默认的spring-boot-maven-plugin插件,进行项目打包,这个插件会将项目所有的依赖打入BOOT-INF/lib下,这就导致了jar包的体积非常臃肿,尤其涉及到几十个子项目时,整个项目的体积可想而知。但是,各项目之间有非常多的公共依赖,因此,分离打包还是比较有意义的。

1.pom文件配置

  • properties标签中定义依赖的输出目录、jar包的输出目录、resources中配置文件的输出目录。
    <properties><!--依赖输出目录--><output.dependence.file.path>lib/</output.dependence.file.path><!--jar输出目录--><output.jar.file.path>bin/</output.jar.file.path><!--配置文件输出目录--><output.resource.file.path>/</output.resource.file.path><!--配置项目输出目录--><env.LEARN_HOME>olive</env.LEARN_HOME>
    </properties>
    
  • build标签:plugins标签中一共包含三个插件:maven-jar-plugin、maven-dependency-plugin和maven-resources-plugin。
    <build><plugins><!-- 打JAR包,不包含依赖文件;显式剔除配置文件 --><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-jar-plugin</artifactId><configuration><!--${env.LEARN_HOME}为项目配置的环境变量,下同--><outputDirectory>${env.LEARN_HOME}/${output.jar.file.path}</outputDirectory><!-- 将配置文件排除在jar包 --><excludes><exclude>**/*.properties</exclude><exclude>**/*.yml</exclude><exclude>**/*.xml</exclude><exclude>**/*.txt</exclude></excludes><archive><!-- 生成的jar中,包含pom.xml和pom.properties这两个文件 --><addMavenDescriptor>true</addMavenDescriptor><!-- 生成MANIFEST.MF的设置 --><manifest><!--这个属性特别关键,如果没有这个属性,有时候我们引用的包maven库 下面可能会有多个包,并且只有一个是正确的,其余的可能是带时间戳的,此时会在classpath下面把那个带时间戳的给添加上去,然后我们在依赖打包的时候,打的是正确的,所以两头会对不上,报错。 --><useUniqueVersions>false</useUniqueVersions><!-- 为依赖包添加路径, 这些路径会写在MANIFEST文件的Class-Path下 --><addClasspath>true</addClasspath><!-- MANIFEST.MF 中 Class-Path 各个依赖加入前缀 --><!--这个jar所依赖的jar包添加classPath的时候的前缀,需要 下面maven-dependency-plugin插件补充--><!--一定要找对目录,否则jar找不到依赖lib,前边加../是因为jar在bin下,而bin与lib是平级目录--><classpathPrefix>../${output.dependence.file.path}</classpathPrefix><!--指定jar启动入口类 --><mainClass>com.gdb.main.MainApplication</mainClass></manifest><manifestEntries><!-- 假如这个项目可能要引入一些外部资源,但是你打包的时候并不想把 这些资源文件打进包里面,这个时候你必须在这边额外指定一些这些资源文件的路径,假如你的pom文件里面配置了 <scope>system</scope>,就是你依赖是你本地的资源,这个时候使用这个插件,classPath里面是不会添加,所以你得手动把这个依赖添加进这个地方 --><!--MANIFEST.MF 中 Class-Path 加入自定义路径,多个路径用空格隔开 --><!--此处resources文件夹的内容,需要maven-resources-plugin插件补充上--><Class-Path>../${output.resource.file.path}</Class-Path></manifestEntries></archive></configuration></plugin><!-- 复制依赖的jar包到指定的文件夹里 --><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-dependency-plugin</artifactId><executions><execution><id>copy-dependencies</id><phase>package</phase><goals><goal>copy-dependencies</goal></goals><configuration><!-- 拷贝项目依赖包到指定目录下 --><outputDirectory>${env.LEARN_HOME}/${output.dependence.file.path}</outputDirectory><!-- 是否排除间接依赖,间接依赖也要拷贝 --><excludeTransitive>false</excludeTransitive><!-- 是否带上版本号 --><stripVersion>false</stripVersion></configuration></execution></executions></plugin><!-- 用于复制指定的文件 --><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-resources-plugin</artifactId><executions><!-- 复制配置文件 --><execution><id>copy-resources</id><phase>package</phase><goals><goal>copy-resources</goal></goals><configuration><resources><resource><directory>src/main/resources</directory><includes><!--将如下格式配置文件拷贝--><!-- 将resouces包下的所有文件 --><exclude>**/*.*</exclude></includes></resource></resources><!--输出路径--><outputDirectory>${env.LEARN_HOME}/${output.resource.file.path}</outputDirectory></configuration></execution></executions></plugin></plugins>
    </build>
    
  • 在上面的配置中会看到有…/这种相对路径的配置,这是为了让程序能够找到它依赖的lib和配置文件。即一切从最终的jar包出发,考虑如何让它能够找到它所依赖的lib和配置文件即可。
  • 注意:maven-jar-plugin插件中启动类的位置需要根据自己的项目设置。

2.打包后的目录结构

在这里插入图片描述


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/521227.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

是什么短波与超短波通信,水利短波通信系统详解

1、短波通信 频率在3—30MHZ。依靠无线电波从电离层反射传播实现通信。实际使用的工作频率与通信线路长度及地理位置有关&#xff0c;而且随昼夜、季节和太阳黑子活动周期而变。 短波通信易受电离层骚扰等活动的影响&#xff0c;而且频率拥挤&#xff0c;干扰严重&#xff0c;通…

vue实现文字手工动态打出效果

vue实现文字手工动态打出效果 问题背景 本文实现vue中&#xff0c;动态生成文字手动打出效果。 问题分析 话不多说&#xff0c;直接上代码&#xff1a; <template><main><button click"makeText"><p class"text">点击生成内容…

SAM多目标跟踪与分割TAM论文解读Track Anything: Segment Anything Meets Videos

一、总结 1. 简介 发表时间&#xff1a;2023年4月28日 论文&#xff1a;[2304.11968] Track Anything: Segment Anything Meets Videos (arxiv.org)https://arxiv.org/abs/2304.11968代码&#xff1a;gaomingqi/Track-Anything: Track-Anything is a flexible and interacti…

javascript正则深入

文章目录 一、前言二、高级`API`2.1、模式匹配的用法`(x)`2.2、非捕获括号的模式匹配`(?:x)`2.3、先行断言`x(?=y)`2.4、后行断言`(?<=y)x`2.5、正向否定查找`x(?!y)`2.6、反向否定查找`(?<!y)x`2.7、字符集合和反向字符集合的用法 `[xyz] / [^xyz]`2.8、词边界和非…

MacOS包管理工具homebrew使用教程

MacOS包管理工具homebrew使用教程 1.概述与安装2.基本使用3.其他常用命令 1.概述与安装 homebrew是Mac OS X上的强大的包管理工具&#xff0c;可以高效管理各种软件包 安装&#xff1a; 1、安装xcode&#xff1a; xcode-select --install2、一行命令下载&#xff1a; /bin…

四川宏博蓬达法律咨询:专业领航,法治路上的坚实后盾

在法治社会中&#xff0c;法律咨询服务扮演着举足轻重的角色。四川宏博蓬达法律咨询&#xff0c;作为业界的佼佼者&#xff0c;以其正规可靠的服务赢得了广大客户的信赖和好评。今天&#xff0c;我们就来一起了解一下这家在法律服务领域备受赞誉的企业。 一、正规资质&#xff…

Java Day5 常用API

文章目录 1、Math2、System3、Runtime4、BigDecimal5、Date日期6、SimpleDateFormat 1、Math double s1.2;System.out.println(Math.ceil(s));//2.0System.out.println(Math.floor(s));//1.0int a-1;System.out.println(Math.abs(a));//1System.out.println(Math.pow(2, 2));//…

【数据结构与算法】二分查找题解(二)

这里写目录标题 一、81. 搜索旋转排序数组 II二、167. 两数之和 II - 输入有序数组三、441. 排列硬币四、374. 猜数字大小五、367. 有效的完全平方数六、69. x 的平方根 一、81. 搜索旋转排序数组 II 中等 已知存在一个按非降序排列的整数数组 nums &#xff0c;数组中的值不必…

学习c语言:编译和链接

一、 翻译环境和运⾏环境 在ANSIC的任何⼀种实现中&#xff0c;存在两个不同的环境。 第1种是翻译环境&#xff0c;在这个环境中源代码被转换为可执⾏的机器指令。 第2种是执⾏环境&#xff0c;它⽤于实际执⾏代码。 二、 翻译环境 那翻译环境是怎么将源代码转换为可执⾏的机…

基于JavaWeb开发的springboot游戏商城平台论文【附源码】

基于JavaWeb开发的springboot游戏商城平台论文 &#x1f345; 作者主页 央顺技术团队 &#x1f345; 欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; &#x1f345; 文末获取源码联系方式 &#x1f4dd; &#x1f345; 查看下方微信号获取联系方式 承接各种定制系统 &#…

Linux报错排查-刚安装好的ubuntu系统无法ssh连接

Linux运维工具-ywtool 目录 一.问题描述二.问题解决2.1 先给ubuntu系统配置阿里云源2.2 安装openssh-server软件2.3 在尝试ssh连接,可以连接成功了 三.其他命令 一.问题描述 系统:ubuntu-18.04-desktop-amd64 系统安装完后,想要通过xshell软件连接系统,发现能Ping通系统的IP,但…

基于sprinbgoot的火锅店管理系统(程序+数据库+文档)

** &#x1f345;点赞收藏关注 → 私信领取本源代码、数据库&#x1f345; 本人在Java毕业设计领域有多年的经验&#xff0c;陆续会更新更多优质的Java实战项目&#xff0c;希望你能有所收获&#xff0c;少走一些弯路。&#x1f345;关注我不迷路&#x1f345;** 一、研究背景…