# 路径

back2专题

# SpringBoot打jar包或war包获取不到资源文件解决办法

back

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

# 一种是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

# springBoot路径

back

# 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
String rootTemplatePath = Optional.ofNullable(ResourceUtils.getURL("classpath:").getPath())
                    .orElse("E:/IDEA_Work/mysession/src/main/resources/");
            System.out.println(rootTemplatePath);
1
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

输出:

E:\IDEA_Work\mysession\target\classes\static\images\banner.jpg
1

# ClassUtils

String pathStr = ClassUtils.getDefaultClassLoader().getResource("").getPath();
            System.out.println(pathStr);
1
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

输出(根据请求的地址不同serverName会不同,可能是ip、域名、localhost等):

http://localhost:8088/clm
1
 String pathStr2 = request.getServletContext().getRealPath("/images/banner.jpg");
            System.out.println(pathStr2);
1
2

输出:
由于springboot内嵌容器,所以导致这么样一个输出结果

D:\rubbish\tomcat-docbase.6162807379308812060.8088\images\banner.jpg
1