读取方式分类

  • 外部web容器文件
  • 内置web容器文件

读取外部web容器文件

外部web容器会将部署的war包解压出来,读取方式无需注意

// 方法1:获取文件或流
this.getClass().getResource("/")+fileName;
this.getClass().getResourceAsStream(failName);
// 方法2:获取文件
File file = org.springframework.util.ResourceUtils.getFile("classpath:test.txt");
// 方法3:获取文件或流
ClassPathResource classPathResource = new ClassPathResource("test.txt");
classPathResource .getFile();
classPathResource .getInputStream();

读取内置web容器文件

这种情况,在开发阶段,通过上面提到的方法都可以读取到文件,但是通过jar方式部署后,jar包内文件无法通过文件路径方式得到。

ClassPathResource classPathResource = new ClassPathResource("test.txt");
classPathResource .getInputStream();

 

1、spring boot默认加载文件的路径:

  1. /META-INF/resources/
  2. /resources/
  3. /static/
  4. /public/

我们也可以从spring boot源码也可以看到:

?

1

2

3

4

5

private static final String[] CLASSPATH_RESOURCE_LOCATIONS = {

    "classpath:/META-INF/resources/",

    "classpath:/resources/",

    "classpath:/static/",

    "classpath:/public/" };

2、Classpath含义

  1. 存放各种资源配置文件 eg.init.properties log4j.properties struts.xml
  2. 存放模板文件 eg.actionerror.ftl
  3. 存放class文件对应的是项目开发时的src目录编译文件

总结:这是一个定位资源的入口 

一般java项目中 classpath存在与 WEB-INFO/目录。 

当我们需要某个class时,系统会自动在CLASSPATH里面搜索,如果是jar,就自动从jar里面查找,如果是普通的目录,则在目录下面按照package进行查找。 

但与PATH不同的是,默认的CLASSPATH是不包含当前目录的,这也是CLASSPATH里面要包含一个点的道理了。

Tomcat下的Web应用有两个预置的classpath : WEB-INF/classes 和WEB-INF/lib启动项目,项目就会加载这两个目录里的数据。这是war包的规范.要改变预置的classpath比较麻烦,在Tomcat的配置文件里没有发现类似的配置,要实现自己的classloader才能达到目的。

一个在tomcat中运行的web应用.它的classpath都包括如下目录: 

我知道的有: 

  1. %tomcat%/lib
  2. web-inf/lib
  3. web-inf/classes 

环境变量里的classpath

总结:classpath这是一个定位资源的入口.classpath下 lib的优先级大于classes;

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐