问题起因
今天在看书的时候看到Spring里资源访问部分,有个从类路径寻找资源文件的类叫做ClassPathResource,他的祖先类是Resource,可以从类路径跟目录寻找资源文件。但是在我写代码试验的时候发现总是找不到资源文件导致频频报错。
以上提到的类均是指spring 框架提供的
问题“解决”
后来我意识到我犯了一个大错误,这里的从类根目录加载文件指的是便宜好的存放.class文件的目录,而不是源文件类的目录(基础知识不扎实)。于是我尝试去读取.class文件
public class Demo {
public static void main(String[] args) {
ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
Resource resource = new ClassPathResource("com/yeonon/Demo.class");
System.out.println(resource.exists());
}
}
结果返回的是True,但是如果我换成Demo.java,结果返回的就是False了,说明从“从类的路径查找文件”这句话的意思应该是从编译好的存放.class文件目录查找,这似乎解决了问题。
“风波再起”
现在我们是知道在哪里读取文件了,最直接的办法是把资源文件(例如beans.xml)放到编译好的目录中去,好像这就能解决问题了。但是,到时候程序发布的时候是不可能连同这个目录一起发布的,那该怎么办呢?这时候就要利用resources这个目录了(好像这是Spring建议创建的一个资源目录),将文件放入这个目录就能正确的读取文件了。
为什么能直接从resources目录读取,目前我不清楚是IDEA的功劳还是Spring的功劳。
最后
这次错误主要是不能理解“类路径下查找”这句话的意思,归根结底还是java基础不扎实。顺便说一下资源查找还有一种方法比较方便:
ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
Resource resource = resolver.getResource("classpath:beans.xml");
配个书上的图吧: