气炸!又一次被编辑器坑了!
来看看你中过这招么?
大家好,我是鱼皮。
最近工作比较忙碌,做完技术选型后,这两周开始上手开发了。首先是用 Java 数据访问框架对接 PgSQL,本来以为至多半个小时就能搞定了,结果没想到,我竟然被编辑器给坑了!耽误了好一会儿。
把被坑的经历分享出来,希望大家引以为戒。
踩坑
我选用的是 MyBatis 框架,来实现在 Java 中操作 PgSQL 数据库。
该框架需要读取 xml 配置文件来实现对象关系映射,看了一下项目目录,惊喜地发现之前有同事已经接入了 MyBatis,并且写好了一份配置文件。
已有配置文件如下:
既然有现成的,那我只需要有样学样,复制粘贴即可。于是,遵循同事取包名的风格,我新建了一个目录:
然后把配置文件复制过去,略作修改即可,当前目录如下:
搞定配置文件后,就可以试着读取它,连接下数据库。再次惊喜地发现同事已经编写好了一个测试类,代码如下:
public static void main(String[] args) {
DatabaseClient pg = new DatabaseClient(
// 数据库属性文件
"db.properties",
// 编写的配置文件
"aaa/config/sql-map-config.xml"
);
}
之前的同事测试的是 aaa/config
配置文件,那我只需要把 aaa
改成 bbb
,不就可以连接成功了么?
运行!
呕豁,报错了,说是找不到文件?
奇怪了,文件明明存在啊?大家来帮忙找找茬,到底是哪里出现了问题呢?
排坑
下面来排排坑吧,首先我研究了一会儿 aaa
和 bbb
目录下配置文件的差异,结果完全找不出问题。
好吧,是我傻了,出了 bug 要从报错信息查起。既然说找不到文件,那就看一下构建目录中配置文件是否有被打包进去。
这一看,果然查出问题了,构建目录如下:
大家发现了差异了么,aaa/config
是两个独立的目录,对应两个 Java 的包;而 bbb.config
根本就是一个目录,只不过目录名称中正好出现了包名的点分隔符!
所以 bbb.config
的配置文件路径应该是 bbb.config/sql-map-config.xml
,而不是 bbb/config/sql-map-config.xml
!
唉,原来是中了开发工具的 “障眼法”,在 JetBrains 全家桶中,有一个视图设置,当包中没有文件时,会对中间包进行折叠。
所以最初我建目录的时候,就应该先建立 bbb
目录,再在 bbb
下建立 config
目录,形成嵌套包,而不是直接建了一个名称为 bbb.config
的目录。
这个微小的差别如果不进入构建目录,是根本发现不了的。
虽然这个问题归根到底是由自己的粗心导致的,但也值得记录下来,防止以后遇到类似的错误。
就是这样,希望大家以后在使用编辑器的时候多个心眼儿,不要完全相信它!
往期推荐