一句话总结:classpath 等价于 main/java + main/resources + 第三方jar包的根目录。下面详细解释。
首先,classpath顾名思义,是编译之后项目的路径,而不是对源程序的路径描述。但是它与源程序的一些路径是相互对应的,存在映射关系。
需要介绍一下package打包、build 之间的关系及特点:
- 不管是build还是package,都不会把项目中使用的第三方jar包也一起打进去。
build生成了如下的目录:
- 由图可以看出,build将项目进行编译,main/java下的源程序、resource下的静态资源一起打包到了target/classes目录。而package也差不多:
这里的target/classes和jar包根路径 都属于所谓的 classpath,也就是根路径。
打包和构建都会在根路径下创建META-INF文件夹,如果在resource文件夹中再创建一个META-INF文件夹,并在该文件夹中建立其他的静态资源,这些自己创建的静态资源在打包或构建时也会一起打包到classpath:/META-INF文件夹下。
知道了这一特性之后就可以解释项目中对webjars下的静态资源引用的问题了。以jQuery为例:webjars官方将jQuery.js文件放到resources/META-INF/resources/webjars/中,然后将项目打包并发布,就有了我们需要的jar包。我们回忆一下如果要引用一般的jar包内的类需要怎么操作呢?import ort.xxx.xxx,这里的 “org.xxx ” 其实就是"classpath:/org.xxx.xxx";这个jQuery的jar包是一样的道理:
要引用jquery,只需要引用META-INF/resources/xxx,这句话的其实就是在说classpath:/META-INF/ resouces/…因此我们还可以了解到,实际上所有External Libraries中的jar包也属于classpath根路径。当SpringBoot检索资源时,“/”就代表了从根路径搜索,而搜索的范围包括:main/java、main/resources、第三方jar包的根目录。