解读classpath读取resources目录下的文件
作者:人工智 发布时间:2023-01-25 05:49:36
classpath读取resources目录下文件
最近在springboot+maven的项目中去读取资源文件的时候,报了找不到文件的错误。
由此展开了对maven项目编译前和编译后的目录结构的了解,以及对java的classpath的理解。
首先:
由Maven构建的web工程,java代码放在src/main/java路径下,资源(配置文件等)放在src/main/resources路径下,当构建jar包 或 war包时,JVM虚拟机会自动编译java文件为class文件存放在 target/classes目录下,resource资源下的文件会原封不动的拷贝一份到 target/classes 目录下:而我们一般取的classpath就是target/classes目录
你可以通过这种方式打印你的calsspath
A.class.getClassLoader().getResource("").getPath();
这里又引出一个话题,我们可以根据两种不同的方式去获取Resources下的文件
1、class.getResource()
import org.junit.jupiter.api.Test;
public class ResourceTestDemo {
@Test
void getResourceTest(){
System.out.println(ResourceTestDemo.class.getResource(""));
System.out.println(ResourceTestDemo.class.getResource("/"));
}
打印结果:
1、file:/Users/username/Documents/TestDev/MyTraining/XUnit/ResourceTest/target/classes/3.txt
2、file:/Users/username/Documents/TestDev/MyTraining/XUnit/ResourceTest/target/classes/test/2.txt
结果分析:
1、getResource("")不带"/“时候是从当前类所在包路径去获取资源
2、getResource("/")带”/"时候是从classpath的根路径获取
2、getClassLoader().getResource()
@Test
void getClassLoaderResourceTest(){
System.out.println(ResourceTestDemo.class.getClassLoader().getResource(""));
System.out.println(ResourceTestDemo.class.getClassLoader().getResource("/"));
}
打印结果:
file:/Users/qinzhen/Documents/TestDev/MyTraining/XUnit/ResourceTest/target/test-classes/
null
class.getResource()
不带"/"时候是从当前类所在包路径去获取资源class.getResource()
带"/"时候是从classpath的根路径获取class.getResource()
本质上也是调用了getClassLoader,只是封装了一层方便了我们使用而已getClassLoader().getResource("")
不带"/"时候是从classpath的根路径获取getClassLoader().getResource("/")
路径中无法带有"/"getResourceAsStream()
方法仅仅是获取对应路径文件的输入流,在路径的用法上与getResource()一qu
4、批量读取
如果想要批量读区resource下的文件呢?
Resource[] resources = ResourceTestDemo.class.getClassLoader().getResources("validator-config/*.xml");
for (int i = 0; i < resources.length; i++) {
InputStream inputStream = resources[i].getInputStream();
String xmlContent = IOUtils.toString(inputStream, "UTF-8");
System.out.println("content" + i + "=" + xmlContent);
}
5、如果配置文件中要引用这个文件的路径呢?
用classpath:xxx.xml 就可以了(xxx.xml放在resources目录下)。注意是springboot的项目
如果还是取不到,看看你的maven工程的pom文件是否做了过滤文件,比如.keystore文件
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
<excludes>
<exclude>*.keystore</exclude>
</excludes>
</resource>
<resource>
<directory>src/main/resources</directory>
<filtering>false</filtering>
<includes>
<include>*.keystore</include>
</includes>
</resource>
</resources>
</build>
来源:https://blog.csdn.net/qq_35789269/article/details/116766487
猜你喜欢
- 一. 线性表中的顺序表线性表(linear list)是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构,常见
- 把spring-boot项目按照平常的web项目一样发布到tomcat容器下一、修改打包形式在pom.xml里设置 <packagin
- 引言思考:HashTable是线程安全的,为什么不推荐使用?HashTable是一个线程安全的类,它使用synchronized来锁住整张H
- 题外话:学习.NET已经有一年了,从C#->ASP.NET->WPF。主要以看电子书为主,比较少写代码。现在回头学习以前接触过的
- 一. switch分支结构1. 简介switch结合case,能够判断一个变量或表达式与一系列值中的某个值是否相等,这里的每个值都被称为一个
- 目录1、GC(Garbage collection )2、GC算法2.1标记活动对象2.2 删除空闲对象2.3 标记清除(Mark-Swee
- 今天写程序的时候用到了附加属性,我是用VS内置的propa的代码段来实现的,代码如下:class Attach {
- SpringBoot访问外部文件及默认路由1 新增配置类package com.pibigstar.common.config;import
- C#接口的学习,在编程中,我们经常会用到接口,那什么是接口呢?接口描述的是可属于任何类或结构的一组相关功能,所以实现接口的类或结构必须实现接
- 背景分析在项目的开发中,不管是对底层的数据逻辑操作过程,还是业务逻辑的处理过程,还是控制逻辑的处理过程,都不可避免会遇到各种可预知的、不可预
- 1、SSL介绍和说明SSL的配置也是我们在实际应用中经常遇到的场景SSL(Secure Sockets Layer,安全套接层)是为网络通信
- Java——获取字符串编码格式判断一个字符串的编码格式: public static St
- 今天有朋友问我Struts2中Action必须实现execute方法吗?顺利的回答出来了。其实分两种情况:1)如果你的Action类是继承自
- 引用Spring官方文档的说法介绍一下@Conditional注解:Spring5.0.15版本@Conditional注解官方文档@Con
- ArrayBlockingQueue介绍ArrayBlockingQueue是数组实现的线程安全的有界的阻塞队列。线程安全是指,ArrayB
- Spring多配置文件有什么好处? 按照目的、功能去拆分配置文件,可以提高配置文件的可读性与维护性,如将配置事务管理、数据源等少改动的配置与
- 1.用intellij idea 创建了一个springboot的项目,前期都运行的好好的,在ide中可以正常运行,但是打包成Jar运行却一
- bean 的生命周期对象创建实例化Bean对象,默认选择无参构造方法,如果只有一个有参构造那么调用有参构造,如果只有多个有参构造那么报错,除
- 本文实例讲述了C#定时关闭窗体的方法,分享给大家供大家参考。具体方法如下:public partial class Form2 : Form
- 前言之前写了一个博客是关于使用SpringBoot使用validation-api实现参数校验,当时使用的注解都是validation-ap