在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>

其中:

  1. <resources>为主标签。其下有多个<resource>
  2. 对于每一个<resource>,都需要设置一个<directory>来指定来源。其默认值为${basedir}代表工程根目录,可以省略。
  3. <resource>对应地,用<targetPath>来指定输出目录。其默认值为${project.build.outputDirectory},代表classes文件夹,可以省略。
  4. <includes>标签用于筛选指定文件。可以是指定名称,或者指定类型。其格式为:
     
    <includes>
        <include>*.xml</include>
    </includes>

    一个<includes>下包含多个<include>标签,每个都可定义一个或一种文件。

    需要注意的是若没有使用通配符,<include>标签必须指定具体文件夹路径,且只会获取该文件夹下的直接子文件,不会获取多级子文件夹下的文件。

  5. <includes>对应地,<excludes>用于排除指定的文件。
  6. <filtering>标签用于设置是否替换文件中表达式的值。

综上,可以得知Resources Plugin是不对.java和资源文件作区分的。因此若没有使用<include>来指定某一类文件,是可以将.java文件也复制到classes文件夹下的。

另外,Resources Plugin会覆盖掉iml的设置。因此若使用Resources Plugin,则需要将src/main/resources路径也添加到这里。

 

修改iml的方式简单高效。而Resources Plugin更加灵活。因此对于资源文件分散程度较小的工程,可以采用iml的方式;对于资源文件分散程度较大的工程,推荐使用Resources Plugin。

GitHub 加速计划 / sp / spring-boot
73.97 K
40.4 K
下载
spring-projects/spring-boot: 是一个用于简化Spring应用开发的框架。适合用于需要快速开发企业级Java应用的项目。特点是可以提供自动配置、独立运行和内置的Tomcat服务器,简化Spring应用的构建和部署。
最近提交(Master分支:1 个月前 )
fdf24c6c Closes gh-42976 4 天前
3c42ba8c * pr/42974: Fix copyright year of updated file Polish Closes gh-42974 4 天前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐