# 路径
# SpringBoot打jar包或war包获取不到资源文件解决办法
WARNING
通过ClassLoader的getResourceAsStream()方法获取其流,就能够获取到:读取jar里面的文件,我们只能用流去读取,不能用File
通常在开发过程中会碰到读取配置文件的问题,一般有两种方式进行读取。这两种虽然都能读取文件,但是在path的填写上有一点点的不同。
# 一种是Class.getResource(String path)
- path
以/开头:则是从ClassPath根下获取 - path
不以/开头:默认是从此类所在的包下取资源
public class Test {
public static void main(String[] args) {
System.out.println(Test.class.getResource("/"));
System.out.println(Test.class.getResource(""));
}
}
// file:/Users/hupengfei/git/Test/out/production/classes/
// file:/Users/hupengfei/git/Test/out/production/classes/Practice/Day13/
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
# 一种是ClassLoader.getResource(String path)
ClassLoader.getResource的path中不能以/开头,path是
默认是从根目录下进行读取的
System.out.println(Test.class.getClassLoader().getResource(""));
System.out.println(Test.class.getClassLoader().getResource("/"));
// file:/Users/hupengfei/git/Test/out/production/classes/
// null
1
2
3
4
5
2
3
4
5
# springBoot路径
# ResourceUtils
springboot中不建议使用这个工具类,因为springboot如果是打成jar包来发布运行就会有问题。
getFile()不能嵌套在jar文件中,如果需要在SpringBoot项目中读取资源文件,最好使用getInputStream()。了解到这些后,我把上诉代码改成如下:
ClassPathResource cpr = new ClassPathResource("static/images/logo.png");
InputStream in = cpr.getInputStream();
InputStream fontStream = com.itextpdf.io.util.ResourceUtil.getResourceStream("template/" + "STZHONGS.TTF"))
1
2
3
4
2
3
4
String rootTemplatePath = Optional.ofNullable(ResourceUtils.getURL("classpath:").getPath())
.orElse("E:/IDEA_Work/mysession/src/main/resources/");
System.out.println(rootTemplatePath);
1
2
3
2
3
输出:
/E:/IDEA_Work/mysession/target/classes/
1
File imFile = ResourceUtils.getFile(ResourceUtils.CLASSPATH_URL_PREFIX+"static/images/banner.jpg");
System.out.println(imFile.getPath());
1
2
2
输出:
E:\IDEA_Work\mysession\target\classes\static\images\banner.jpg
1
# ClassUtils
String pathStr = ClassUtils.getDefaultClassLoader().getResource("").getPath();
System.out.println(pathStr);
1
2
2
输出:
/E:/IDEA_Work/mysession/target/classes/
1
# HttpServletRequest-request
String pathStr1 = "http://"+request.getServerName()+":"+request.getServerPort()+request.getContextPath();
System.out.println(pathStr1);
1
2
2
输出(根据请求的地址不同serverName会不同,可能是ip、域名、localhost等):
http://localhost:8088/clm
1
String pathStr2 = request.getServletContext().getRealPath("/images/banner.jpg");
System.out.println(pathStr2);
1
2
2
输出:
由于springboot内嵌容器,所以导致这么样一个输出结果
D:\rubbish\tomcat-docbase.6162807379308812060.8088\images\banner.jpg
1