Idea Maven打包后不能读取resources下的配置文件

时间:2024-03-21 16:48:45

问题描述

正常情况下,在idea中

new FileInputStream("src/main/resources/table.xml")

或者

new File("src/main/resources/table.xml")

程序可以执行,没有任何问题。

如果打包后运行java -jar xx.java 

会报错找不到资源文件Idea Maven打包后不能读取resources下的配置文件

要取编译后的路径,而不是你看到的src/main/resources的路径。如下:

URL url = MyTest.class.getClassLoader().getResource("table.xml");
File file = new File(url.getFile());
 或者
InputStream in = MyTest.class.getClassLoader().getResourceAsStream("table.xml");

第二种方法,也可以改成
InputStream in = getClass().getClassLoader().getResourceAsStream("conf.properties");
 

注意

要查看maven 打包后,配置文件是否打包进jar包

定位问题:

1.配置文件打包进jar包,但是不能获取资源。(问题描述中的解决办法)

2.配置文件没有打包进jar包,这时要设置pom文件

Idea Maven打包后不能读取resources下的配置文件

 

 

 ClassLoader() 的作用

classLoader主要对类的请求提供服务,当JVM需要某类时,它根据名称向ClassLoader要求这个类,然后由ClassLoader返回这个类的class对象。

ClassLoader负责载入系统的所有资源(Class,文件,图片,来自网络的字节流等),通过ClassLoader从而将资源载入JVM 中。每个class都有一个引用,指向自己的ClassLoader。

getClassLoader() 的作用

getClass():取得当前对象所属的Class对象 
  getClassLoader():取得该Class对象的类装载器
  类装载器负责从Java字符文件将字符流读入内存,并构造Class类对象,在你说的问题那里,通过它可以得到一个文件的输入

Class.getClassLoader()的一个小陷阱,空指针异常:
  昨天我的code总在Integer.class.getClassLoader().getResource("*********");这一句抛出空指针异常,定位为getClassLoader()返回null,查了一下jdk的文档,原来这里还有一个陷阱:
  这里jdk告诉我们:如果一个类是通过bootstrap 载入的,那我们通过这个类去获得classloader的话,有些jdk的实现是会返回一个null的,比如说我用 new Object().getClass().getClassLoader()的话,会返回一个null,这样的话上面的代码就会出现NullPointer异常.所以保险起见我们最好还是使用我们自己写的类来获取classloader("this.getClass().getClassLoader()“),这样一来就不会有问题。

getResourceAsStream()方法详解

getResourceAsStream()用法与getResouce()方法一样的,用getResource()取得File文件后,再new FileInputStream(file) 与 getResourceAsStream() 的效果一样。。