Spring-Boot的classpath:iml设置与Resources Plugin
在Spring-Boot中,特别是.properties文件中,常常可以看到某些路径会以classpath开头:
mybatis.config-location = classpath:mybatis/mybatis-config.xml
这个classpath到底是什么?
对于一个编译过的Spring-Boot工程,会生成一个target文件夹,该文件夹下有多个子文件夹:
其中的classes子文件夹,就是classpath。
Spring-Boot工程编译后,会按照配置,将生成的.class文件和各类资源文件放到classes文件夹下。同时配置也决定了是直接放到classes根目录,还是带有文件夹路径。
一. iml中的sourceFolder
Spring-Boot工程会将某些文件夹标记为<sourceFolder>。被<sourceFolder>所标记的文件夹会保留子文件夹结构,生成到classes文件夹下。默认的<sourceFolder>文件夹有3个,在工程根目录的XXX.iml文件中:
<sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/main/resources" type="java-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/test/java" isTestSource="true" />
即:src/main/java文件夹,src/main/resources文件夹,src/test/java文件夹。
这三个文件夹下的所有递归子文件,.java文件会被编译为.class文件。资源类文件直接复制过来。
虽然同为<sourceFolder>,但type却不同。资源类文件的type是java-resource。
如图,可以看到:
- source类资源,也就是源码文件夹,是蓝色。会将.java编译为.class,然后生成到target/classes目录下。若其下有资源类文件,忽略。
- resources类资源,也就是资源文件夹,右下角带有多条黄色横线。会将其下所有子文件和文件都会被直接复制到target/classes文件夹下。若其下有.java文件,忽略。
- test source类资源,也就是测试源码文件夹,是绿色。同source类资源。
这一点打开菜单File→Project Structure,选择Modules,右侧选择Sources,也能看到:
在这里可以直接添加删除不同的资源文件夹,与修改XXX.iml效果相同。
src/main/resources文件夹默认被设置为Resource Folders。因此该文件夹下所有的子文件和文件都会被直接复制到target/classes文件夹下。
这就是为什么放在src/main/resources文件夹根目录下的文件,可以用classpath:+名称来直接引用。
同理,若要引用的某个资源文件不在src/main/resources文件夹下,那么只需要将该资源文件所在的某一级父文件夹设置为Resource Folders,即可使用classpath:+路径+名称来访问。
总之,对于一个资源文件,只要确保其某一级父文件夹是Resource Folders(通过修改XXX.iml或直接打开上面的界面修改),那么就一定可以用classpath:+路径+名称来访问。
二. Resources Plugin
Maven有个Resources Plugin插件,用于将指定目录的文件复制到指定的地址,作用类似<sourceFolder>标签。
不同的是,<sourceFolder>需要在XXX.iml中设置,而Resources Plugin是在pom.xml中设置。
可以这样理解:Resources Plugin就是<sourceFolder>的动态版本。
引入:
<build>
<resources>
<resource>
<directory>
${basedir}/src/main/java/com/template/mapper
</directory>
</resource>
<resource>
<directory>src/main/resources</directory>
</resource>
</resources>
</build>
其中:
- <resources>为主标签。其下有多个<resource>。
- 对于每一个<resource>,都需要设置一个<directory>来指定来源。其默认值为${basedir},代表工程根目录,可以省略。
- 与<resource>对应地,用<targetPath>来指定输出目录。其默认值为${project.build.outputDirectory},代表classes文件夹,可以省略。
- <includes>标签用于筛选指定文件。可以是指定名称,或者指定类型。其格式为:
<includes> <include>*.xml</include> </includes>
一个<includes>下包含多个<include>标签,每个都可定义一个或一种文件。
需要注意的是若没有使用通配符,<include>标签必须指定具体文件夹路径,且只会获取该文件夹下的直接子文件,不会获取多级子文件夹下的文件。
- 与<includes>对应地,<excludes>用于排除指定的文件。
- <filtering>标签用于设置是否替换文件中表达式的值。
综上,可以得知Resources Plugin是不对.java和资源文件作区分的。因此若没有使用<include>来指定某一类文件,是可以将.java文件也复制到classes文件夹下的。
另外,Resources Plugin会覆盖掉iml的设置。因此若使用Resources Plugin,则需要将src/main/resources路径也添加到这里。
修改iml的方式简单高效。而Resources Plugin更加灵活。因此对于资源文件分散程度较小的工程,可以采用iml的方式;对于资源文件分散程度较大的工程,推荐使用Resources Plugin。
更多推荐
所有评论(0)