开局先吐槽
IDEA有毒, 真的 以前的我也是月食的钟爱党, 也曾和他们一样各种鄙视靠各种快捷键吃饭的IDEA程序员(莫着急, 我还有话说, 说完再打… ) 士大夫,没想到,打脸来的总是措不及防,最近有个项目不得已移植到IDEA,那一刻我承认我堕落了,我愧对我党,真香啊…
为啥说它有毒, 从标题你就看出来了, 同样的使用 相对路径 访问Resource资源的代码Eclipse运行没毛病, IDEA却频繁报错
上代码瞧瞧 这有毒的IDEA
public class PropertiesUtil{
private static Properties properties=new Properties();
static {
InputStream inputStream=null;
try {
//inputStream = new FileInputStream("server.properties"); 和下面效果一样
inputStream = PropertiesUtil.class.getResourceAsStream("server.properties");
properties.load(inputStream);
} catch (IOException e) {
e.printStackTrace();
throw new RuntimeException("服务器配置文件出错");
}finally {
if(inputStream!=null) {
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
public static String getValue(String key) {
return properties.getProperty(key)==null ? "" : properties.getProperty(key);
}
public static void main(String[] args) {
System.out.println(PropertiesUtil.getValue("server.port"));
}
}
报错分析
首先上面这段代码在eclipse
老铁那里 一点毛病也没有, 但是IDEA却出现FileNotFound
异常 试过两种方式(注释) 都不行, 无奈找度娘, 发现2种解决方案
但很可惜, 均没有效果, 也给出来参考一下, 可能对于其他情况适用
- 修改pom.xml
<!-- <resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.xml</include>
<include>**/*.properties</include>
</includes>
</resource>-->
这种方式后来我才明白适用于web项目, 而我这个是非Web的所以还是不起作用
- 使用绝对路径 这个肯定是可以的, 但是这就有种和IDEA硬刚的味道, 不好不好
原则把握
后来,我将疑惑转求我的恩师, 以下是原话:
Eclipse的classpath
默认
(可以修改)是基于src的, 而IDEA通常是基于Maven风格 而Maven风格classpath默认基于java目录和resources目录
而程序最终的执行的是.class文件 不是.java文件, 因此研究路径的应该研究
字节码
所在目录 而不是源码所在目录
看到这段话 不知各位有啥想法吗 我顿时灵光一现 放最终成功代码 仅仅将上面的inpustream
获取方式修改一下
inputStream= PropertiesUtil.class.getClassLoader().getResourceAsStream("server.properties");
解释一哈: 既然我们研究的目标现在确定是字节码
所在目录, 那么我们要获取其路径下的资源 很明显应该通过类加载器的方式来获取, 因为对于IDEA只有类加载器才可以访问字节码目录,
至此完美解决, 再无异常…
临终来两句
不得不说 我的恩师在指点迷津的这方面 颇有造诣, 每次问他问题 都不会告诉我应该怎么做 而是提供思路, 最终我的解决方案都是来源此, 所以很感谢我的老师, 对我的技术成长有很大的帮助.
哦对了, 各位遇到该问题的童鞋 赶紧试试吧 有问题评论区哦…(回复率101%, 多出的1%是我对你们的爱哦)