Java 大佬进!实在弄不明白这个问题了

11 天前
 qclown
背景: springboot 应用打包成 jar 包运行,读取了依赖 jar 包下的 application.yml 作为应用配置文件。
问题: 不是说好了:Spring Boot 的配置文件加载机制主要关注以下位置:
file:./config/
file:./
classpath:/config/
classpath:/
那为啥 springboot 应用依赖的 jar 包下的 application.yml 也会被当前 sprintboot 应用加载为配置文件。
其他 jar 包下的文件,不应该不算在 classpath:/ 下吧。
实在整不明白了,求助各位大佬。
2141 次点击
所在节点    Java
12 条回复
ElegantOfKing
11 天前
当你在 Spring Boot 应用中依赖某个 Jar 包时,如果这个 Jar 包中包含 application.yml 文件,它也在 classpath 范围内。所以它也会被加载并被视为配置来源之一。

Spring Boot 的 SpringApplication 启动过程中会使用 ConfigFileApplicationListener 加载配置文件,该类的实现会扫描 classpath ,包括依赖的 Jar 包内容。
CLMan
11 天前
因为 classpath 有两种格式:文件夹、jar 包,换句话说:

比如`java -classpath /home/root/a.jar`等价于`java -classpath /home/a`,`a`是`a.jar`解压后的根目录。

也就是当你 classpath 指定 jar 包时,等价于 jar 包内的内容位于`classpath:/`下。
CLMan
11 天前
@CLMan `java -classpath /home/a`修正为`java -classpath /home/root/a`
qclown
11 天前
@CLMan
@ElegantOfKing
感谢两位大佬,之前我理解错了。
我理解类路径是一个树型的目录结构。
但实际上,类路径是一个目录或者 jar 包路径构成的路径列表,列表中的每个目录是一个树型目录结构。
当查找类路径中的资源,比如 / /config 时,是按优先级遍历类路径下的目录,寻找这个目录下的 / /config ,一旦找到了就返回。
所以 classpath:/ 是指所有类路径的根目录,而不是某一个路径(比如当前 jar 里)
ZZ74
10 天前
其他 jar 包下的文件,不应该不算在 classpath:/
No ,是算的。
CLMan
10 天前
@qclown 是的,理解为 list 更恰当一点。
huyangq
9 天前
你可能没理解什么是 classpath
house600
8 天前
有 demo 吗,我怎么没试出来
house600
8 天前
@house600 #8 classpath*才会扫描依赖 jar 包的配置文件吧
qclown
8 天前
@house600 整个 maven 工程,下两工程:config 、web 。配置文件放在 config 下,web 依赖 config 。就会看到配置文件生效了。
house600
7 天前
@qclown #10 搞出来了,父工程没有 application.properties 的情况下才会加载依赖 jar 的 application.properties
qclown
7 天前
@house600 对,因为父工程在类路径 list[0],找到了直接就返回了,不会再去其他类路径下面找了。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1095827

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX