一、背景
介绍: 在业务开发中,我们可能会将几个文件打包成一个压缩文件,而有些文件是固定不变的,可以提前放在资源文件 resource 下面。 这时我们只需要根据相对路径来获取文件。功能看起来很简单,但是遇到的坑倒是不少啊!
在文件编译时,需要将 resource 目录下的文件拷贝到 target 目录的 classes 目录下面,这个才是运行时的文件。因为是使用了 maven ,所以此处是在 pom 文件进行配置。如下(只贴出关键点),这是最终能使用的版本:
<profiles>
<profile>
<id>dev</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<build>
<resources>
<!-- 把资源文件拷贝到classs目录下 -->
<resource>
<targetPath>${project.build.directory}/classes</targetPath>
<directory>src/main/resources</directory>
<!-- 开启过滤,用指定的参数替换directory下的文件中的参数 -->
<filtering>true</filtering>
<!-- 指定具体的文件,带扩展名 -->
<includes>
<include>**/*.xml</include>
<include>**/*.properties</include>
<include>**/*.Filter</include>
</includes>
<!-- 排除文件 -->
<excludes>
<exclude>**/*.exe</exclude>
<exclude>**/*.EXE</exclude>
</excludes>
</resource>
<resource>
<targetPath>${project.build.directory}/classes</targetPath>
<directory>src/main/resources</directory>
<!-- 不开启过滤 -->
<filtering>false</filtering>
<includes>
<!-- 改匹配规则是将 resource 目录下的所有文件夹及文件都包含 -->
<include>**/*</include>
</includes>
</resource>
<!-- 把资源文件log4j到classs目录下 -->
<resource>
<targetPath>${project.build.directory}/classes</targetPath>
<directory>${project.basedir}../../build/template/log-template</directory>
<filtering>true</filtering>
<includes>
<include>**/*</include>
</includes>
</resource>
</resources>
</build>
</profile>
</profiles>
此时就应该对文件进行获取了,获取资源的方法很多种。我下面就说出两种:
// 1. 第一种
file = ResourceUtils.getFile("classpath:" + path);
// 2.第二种(推荐)
ClassPathResource cpr = new ClassPathResource(path);
file = cpr.getFile();