最近项目遇到一个很奇怪的bug导致项目识别不了application.yml文件,spring项目中通常资源文件夹为src/main/java/resources。但项目需要额外引入其他jar包,所以放入了lib中并把其当做资源文件夹,项目project struct如下:
image.png
执行过程后发现无法识别application中的配置,直接给出报错。

  1. No active profile set, falling back to default profiles: default

然而使用maven打包后的jar文件却意外可以正确读取配置文件并执行,这就很有意思了。那么就需要了解IDEA默认执行spring项目的工作机制,以及它的build和maven打的jar包之间的区别。

Build and Run

从Build项目中可以看出IDEA是把项目按照module来进行build的。默认会把整个项目输出到target中,并且会把module编译后输出到target/classes中。build的规则主要会根据project struct和pom.xml两者规定。项目build后输出内容大致如下:
image.png
可以看到这边有两个classes,就感觉是因为这层嵌套问题导致原本的application.yml无法被读取到。先看一下可运行jar包里的项目结构:
image.png