java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > idea启动与jar包启动中使用resource资源文件路径

idea启动与jar包启动中使用resource资源文件路径的问题

作者:某猿蚊常叮

这篇文章主要介绍了idea启动与jar包启动中使用resource资源文件路径的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

idea启动与jar包启动中使用resource资源文件路径

问题描述

项目直接用idea运行的时候好好的,但是打包成Jar之后却出现了莫名其妙的BUG,经过很长时间的调试之后,才发现是打包之后的文件路径出现了问题。

在原本的代码中使用的是这样的代码来读取resource中的文件

ClassLoader classLoader = this.class.getClassLoader();   
URL appUrl = classLoader.getResource("center/AppStarter.java"); 
File appJava = new File(appUrl.getFile());

这样的代码直接运行时没问题的,能够正确的读取到文件,但是打包成jar之后,

在网上查找了很久,终于找到了解决方法。

读取resource中的文件需要使用InputStream来进行读取,然后转换成String。

具体实现可以参看下面的代码。

//2.创建输入流
String path = "META-INF/item.xml"
InputStream is = this.getClass().getClassLoader().getResourceAsStream(path);

这样写了之后打包成jar后能够成功读取到resource中的文件

问题分析

在idea中可以通过绝对路径读取文件,但是package成jar包之后,路径的文件形式发生变化,但是可以通过class路径,然后通过相对路径的方式拿到文件流,达到文件内容的读取。

Jar包启动通过ClassPathResource获取不到文件路径

项目目录结构

在这里插入图片描述

maven项目resources目录也是会被编译到classpath下的。

      ClassPathResource resource = new ClassPathResource("/map/map.properties");
        InputStream inputStream = resource.getInputStream();
        System.out.println("inputStream.available() = " + inputStream.available());
        System.out.println("resource.getFile().getAbsolutePath() = " +    	resource.getFile().getAbsolutePath());

如果是使用idea进行本地开发时,是可以获取到classpath下的资源的路径的,因为是读取的磁盘上的真正的那个文件。

在这里插入图片描述

但是如果将项目打包成一个jar包后,再获取map.properties是获取不到的,对于操作系统来说最多只能读取到jar包,而不能再继续读取jar包里面的文件了,如果继续读取,只能交给jvm去读了,此时能读取到二进制流,而不能获取到路径。

可通过以下几种方式获取classpath下的资源

 ClassPathResource classPathResource = new ClassPathResource("/map/map.properties");
        InputStream cis = classPathResource.getInputStream();
        //获取classpath下第一个/map/map.properties,这个根据jar包的加载先后顺序有关
        InputStream ris = ClassPathResource.class.getClassLoader().getResourceAsStream("/map/map.properties");
        //这个是获取classpath下所有的map/map.properties,在jvm运行时,所有jar都相当于是一个classpath
        Enumeration<URL> resources = ClassPathResource.class.getClassLoader().getResources("/map/map.properties");

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文