V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
qclown
V2EX  ›  Java

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

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

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

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

    也就是当你 classpath 指定 jar 包时,等价于 jar 包内的内容位于`classpath:/`下。
    CLMan
        3
    CLMan  
       17 天前
    @CLMan `java -classpath /home/a`修正为`java -classpath /home/root/a`
    qclown
        4
    qclown  
    OP
       17 天前 via Android
    @CLMan
    @ElegantOfKing
    感谢两位大佬,之前我理解错了。
    我理解类路径是一个树型的目录结构。
    但实际上,类路径是一个目录或者 jar 包路径构成的路径列表,列表中的每个目录是一个树型目录结构。
    当查找类路径中的资源,比如 / /config 时,是按优先级遍历类路径下的目录,寻找这个目录下的 / /config ,一旦找到了就返回。
    所以 classpath:/ 是指所有类路径的根目录,而不是某一个路径(比如当前 jar 里)
    ZZ74
        5
    ZZ74  
       17 天前
    其他 jar 包下的文件,不应该不算在 classpath:/
    No ,是算的。
    CLMan
        6
    CLMan  
       17 天前
    @qclown 是的,理解为 list 更恰当一点。
    huyangq
        7
    huyangq  
       16 天前
    你可能没理解什么是 classpath
    house600
        8
    house600  
       14 天前
    有 demo 吗,我怎么没试出来
    house600
        9
    house600  
       14 天前
    @house600 #8 classpath*才会扫描依赖 jar 包的配置文件吧
    qclown
        10
    qclown  
    OP
       14 天前
    @house600 整个 maven 工程,下两工程:config 、web 。配置文件放在 config 下,web 依赖 config 。就会看到配置文件生效了。
    house600
        11
    house600  
       14 天前
    @qclown #10 搞出来了,父工程没有 application.properties 的情况下才会加载依赖 jar 的 application.properties
    qclown
        12
    qclown  
    OP
       13 天前
    @house600 对,因为父工程在类路径 list[0],找到了直接就返回了,不会再去其他类路径下面找了。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5365 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 07:42 · PVG 15:42 · LAX 23:42 · JFK 02:42
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.