一、背景
- 使用开发工具:Eclipse
- 开发项目:Java Web 项目
- 问题重现:在几天前忙于一个急于上线的项目就没来得及分析总结,现在空下来了就好好整理一下,事情是这样的,那天我在
src
下新建了一个类型为Source Folder
的resource
资源文件夹(项目中还没有此类文件夹),然后再通过一个工具类获取resource
下的文件,当时是使用代码XXX.class.getClassLoader().getResource(filePath)
获取文件,在本机上测试没有问题,接下来上传代码到 SVN,项目经理测试功能,发现使用上述代码获取不到文件,然后仔细看了一下从 SVN 上更新下来的代码,发现resource
文件夹标志和我本地的不一样。我本机的是,从 SVN 下更新下来的是,后面试着将 SVN 下更新下来的该文件夹进行重命名为Source Folder
类型的文件夹就能获取到了。
问题背景就描述到这里,接下来就有一个疑问:为什么将该资源文件夹上传 SVN 后就不是资源文件夹(Source Folder)了,而变成了文件夹(Folder) ?
二、原因分析
带着上述问题,经过反复测试仔细研究发现,在 Eclipse 中新建一个 Source Folder
时,在项目中 .classpath
文件会增加一行信息,例如上面我创建了一个资源文件夹 resource 时就会在 .classpath 文件中增加一行代码 <classpathentry kind="src" path="resource"/>
,这行代码表示 resource 是一个资源文件夹。那么问题为什么将该资源文件夹上传 SVN 后就不是资源文件夹(Source Folder)了,而变成了文件夹(Folder) 这就迎刃而解了,是因为我在上传 SVN 时没有将更改后的 .classpath 文件上传 SVN ,这就造成了项目经理在更新项目后,项目不知道 resource 是资源文件夹,就给当成了文件夹处理。
三、总结
后来想了想,在Java 项目中通过上述的方式获取文件可靠吗?在 Java Web 项目中有哪些获取文件的方式?
带着这两个问题从网上找到了答案,然后自己又经过一番测试发现通过上述代码获取文件是可靠的(我那个文件是配置文件,不会改动)。
首先是我新建一个 Java Web 项目,准备测试环境,目录结构如下:
编写测试类获取文件路径:
package com.util;
/**
* @Description 测试获取文件路径
* @author 欧阳
* @since 2019年1月28日 下午4:25:36
* @version V1.0
*/
public class Test {
public static void main(String[] args) {
//获取src/ClassPath下的文件 111.txt 的绝对路径
System.out.println(Test.class.getClassLoader().getResource("111.txt").getPath());
//获取 src/ClassPath的绝对路径
System.out.println(Test.class.getClassLoader().getResource(".").getPath());
//获取 src/ClassPath的绝对路径
System.out.println(Test.class.getClassLoader().getResource("").getPath());
//获取 src/ClassPath的绝对路径
System.out.println(Thread.currentThread().getContextClassLoader().getResource(".").getPath());
//获取 src/ClassPath的绝对路径
System.out.println(Thread.currentThread().getContextClassLoader().getResource("").getPath());
//获取项目的绝对路径
System.out.println(System.getProperty("user.dir"));
//获取当前类文件的绝对目录,不包括自己的上级目录
System.out.println(Test.class.getResource(".").getPath());
//获取当前类文件的绝对目录,不包括自己的上级目录
System.out.println(Test.class.getResource("").getPath());
//获取webRoot下文件(主要是通过上下文获取和通过request)
// System.out.println(request.getSession().getServletContext().getRealPath("/resource"));
}
}
获取 src / ClassPath 下文件路径有三种:
Test.class.getClassLoader().getResource("111.txt").getPath();
Test.class.getResource("").getPath();
Thread.currentThread().getContextClassLoader().getResource(".").getPath();
获取 Webroot 下文件路径主要是通过上下文和request进行获取,这块就就演示了,有很明显的方法。