前言
这是 2024年04月18日, 一位朋友碰到的问题
甚至于情况是 怎么修改项目中的各个配置文件都不生效, 修改 A 项目, 依赖A的B项目 等等 都不行
问题的调试
这里主要是调试 看一下 spring-boot 的内嵌的 tomcat 这边暴露服务的端口的相关获取
这里 大致提到一些 关键的地方, 大家可以根据 这些地方 来进行排查
如下 这里是 tomcat 这边 connector 初始化端口的地方, 端口来自于 TomcatServletWebServerFactory
TomcatServletWebServerFactory 的端口配置 来自于 ServletWebServerFactoryCustomizer
ServletWebServerFactoryCustomizer 的端口配置来自于 serverProperties
serverProperties 的配置来自于 applicationContext 的整个大局的环境变量
关于 spring-boot 各个配置的来源 可以参见这里
然后 对方同学这里出现的问题现场是
启动的是 appointment 服务, 然后 appointment 的 target/classes 下面没有 application.properties [按正常情况 idea 应该会讲项目的 resources 下面的文件拷贝过去]
然后 equipment 项目的 target/classes 下面有 equipment 的 application.properties 然后 按照 classpath 的优先级, 从 appointment 下面没有找到, 就获取的 equipment 下面的 application.properties
因为 spring-boot 这边读取 application.properties 是获取的 classpath 下面的 application.properties 对应的是 target/classes 下面的 application.properties 因此上面之前修改 equipment 项目中的 application.properties 无效
然后修改 appointment 的 application.properties 之后 idea 这边没有将 application.properties 拷贝到 appointment 的 target/classes
所以 项目启动一直使用的额是 equipment 下面的 target/classes 下面的 application.properties
最终手动拷贝一下 appointment 服务的 application.properties, 就解决问题了, 这种情况 一般是 idea 抽风
问题解决
idea 的正常拷贝行为
正常情况下应该是比如 我项目的 application.yml 发生了改动
然后 我重启项目, idea 会自动将 application.yml 拷贝到 target/classes 下面
完