原创不易,转载请标明地址,或者直接附上我的博客首页https://georgedage.blog.csdn.net/ ,当然最好私信一下,谢谢。
getResource接受一个字符串参数,如果以”/”开头,就在classpath根目录下找(不会递归查找子目录),如果不以”/”开头,就在调用getResource的字节码对象所在目录下找(同样不会递归查找子目录)。
光说不练,不行滴。上代码:
非maven结构
image
image.gif
package com.jd.search;
public class Test {
public static void main(String[] args) {
System.out.println(Test.class.getResource(""));
System.out.println(Test.class.getResource("/"));
System.out.println("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
System.out.println(Test.class.getResource("george.class"));
System.out.println(Test.class.getResource("/george.class"));
System.out.println("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@");
System.out.println(Test.class.getResource("dictionary.txt"));
System.out.println(Test.class.getResource("/dictionary.txt"));
System.out.println("**********************************");
System.out.println(Test.class.getResourceAsStream("/"));
System.out.println(Test.class.getResourceAsStream("/dictionary.txt"));
}
}
image.gif
结果展示:
image
image.gif
【友情提醒】
这里做出建议,如果你不太好记住这个规则,就在进行加载路径时,进行一次输出,或者提前进行一个类似的小demo测试。免得¥,你懂得!!!
当然,本篇博客重点不是说这个,这个大家都懂,说的是,getResource()在maven下的黑洞!
期初用maven建了这个项目,就是去手写一个分词器。
然后呢?发现怎么搞都是空指针,空指针一个常见,也比较好解决的问题,然后我就进行了测试,最终发现了这个问题,写出来,以防各位,日后掉坑。
Maven结构
image
image.gif
代码:
package com.jd.search;
public class Test {
public static void main(String[] args) {
System.out.println(Test.class.getResource(""));
System.out.println(Test.class.getResource("/"));
System.out.println(Test.class.getResource("george.class"));
System.out.println(Test.class.getResource("/george.class"));
System.out.println(Test.class.getResource("dictionary.txt"));
System.out.println(Test.class.getResource("/dictionary.txt"));
System.out.println(Test.class.getResourceAsStream("/"));
System.out.println(Test.class.getResourceAsStream("/dictionary.txt"));
}
}
image.gif
结果展示:
image
image.gif
有心的可以将两次记过进行对比,或者自己敲一下demo。
这里为了方便大家。请看:上面的是非maven结构,下面的是maven结构:
image
image.gif
为什么会出现这样的问题?
我将其归结为maven项目的运行机制导致的。这一点相信你仔细观察路径后也能发现。
还不是很了解的,或者有比较好的了解的,欢迎留言!