您的位置:首页 > 编程语言 > Java开发

解决Java Web项目无法读取配置文件问题

2020-04-07 18:29 1561 查看

错误描述

报错信息如下图所示,Web应用后台在读取配置文件的时候,系统找不到指定的路径。

这是Java Web项目的目录结构:

这是报错部分的代码:

static {
try {
Properties prop = new Properties();
//读取配置文件
InputStream is = new InputStream("src/main/resources/db.properties");
//加载配置文件
prop.load(is);
driver = prop.getProperty("driver");
url = prop.getProperty("url");
user = prop.getProperty("user");
password = prop.getProperty("password");
} catch (Exception e) {
e.printStackTrace();
}
}

做出的尝试:

  • 一般遇到这样的问题的时候,第一反应觉得是路径不小心打错了。于是找到db.properties文件鼠标右击,选择Copy Qualified Name,复制配置文件的路径确保路径的正确性,但是并没有解决这个问题。
  • 既然路径没错还会报错,就让我感到很奇怪。于是,我在该类下写了一个main函数直接跑Java Application去连接数据库,万万没想到居然成功连接上了(即成功读取到了配置文件)。

报错原因:
由上诉第二点应该可以看出来了,其实还是路径的问题,当时做出了一个大胆的猜想:Java项目本地直接运行(Java Application)的根目录和Java Web项目在服务器上运行(Run on Service)的根目录是不同的!

在网上找了相关资料后,证实了我的猜想:

  • 当点击运行Java Application时,项目的根目录是从target/classes开始的
  • 当点击运行Run on Service时,项目的根目录是从WEB_INF/classes开始的

PS:至于为什么是这样,可以去了解一下.classpath文件,它用于记录项目编译环境的所有信息,包括:源文件路径、编译后class文件存放路径、依赖的jar包路径、运行的容器信息、依赖的外部project等信息。

问题解决

知道了出错原因是在路径问题上,那我们就把手动输路径改为通过Class获取资源路径。

获取路径的方法如下,如果给getResource()传入的是"",返回的是JDBCUtils类的路径;如果
传入的是"/",返回的是target/classesWEB_INF/classes

String url = JDBCUtils.class.getResource("/").getPath();

由上面的截图可以看到,配置文件db.properties是放在/class下的,所以要找路径的时候传入"/db.properties"参数即可。

InputStream is = new FileInputStream(JDBCUtils.class.getResource("/db.properties").getPath());
//等价于
InputStream is = JDBCUtils.class.getResourceAsStream("/db.properties");

进行上述更改后,报错信息消失了。我们来进行如下测试:

用Navicat打开数据表可以发现,注册信息已经成功插入表中!

参考资料

  1. http://www.mamicode.com/info-detail-2660250.html
  2. http://www.xuehuile.com/blog/57bd78ef636644dc87963f6189e148dd.html
  3. https://www.cnblogs.com/zhangyinhua/p/7662334.html#_lab2_2_2

一个合格的程序员,应该要善于发现问题。٩(๑>₃<)۶

  • 点赞 1
  • 收藏
  • 分享
  • 文章举报
VeggieOrz 发布了89 篇原创文章 · 获赞 652 · 访问量 70万+ 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: