其实很久之前就想写一个专题就是把工作中遇到的问题收集起来,然后解决方案也提供下,奈何太懒,今天开始就逐一收集,把这个习惯保持下去。
问题起因是这样,这个问题来源于同事,同事需要做一个读写分离的功能,但是需要无感,并且不使用mycat,于是想到读取配置文件mapper下的xml,再解析xml判断所选择的是读还是写操作,这些操作在本地使用起来也没啥问题。等我部署到测试,就出现了空指针异常。于是开始寻找bug。
问题关键:
配置文件在本地的项目属于未打包的,在本地磁盘是以文件的形式存在,所以无论使用哪种方式获取配置文件的目录都可以。打包后的项目是一个jar包,不能通过获取文件夹的方式获取下面的文件名。
这里我贴一下获取配置文件的文件夹下面的文件名其中的一种方式,后续将剩余几种单独写个工具展示出来。后来百度,原来需要通过流去获取文件,然后找到编译后的文件夹,理论上可行,但是依旧以失败告终,他会找到你打包的jar的目录,但是并不能用文件的形式去读取,也就是一切用File的方式读取下面的文件都不行。
解决办法:
这个目前使用的办法真的比较难想, projectPath = System.getProperty(“user.dir”);//当前项目路径,
项目采用的是读取jarFile这个,JarFile jarFile = new JarFile(jarFilePath);使用节点获取下面的文件名
for (Enumeration e = jarFile.entries(); e.hasMoreElements(); ) { //这个循环会读取jar包中所有文件,包括文件夹JarEntry jarEntry = e.nextElement();//jarEntry就是我们读取的jar包中每一个文件了,包括目录if(jarEntry.getName().contains(“resource/aa.txt”){ //getName()会获取文件全路径名称
}.这里需要注意要区分linux服务器和本地,本地简单不做考虑,linux服务的要找到jar位置,然后读取jar里面的文件,使用节点,就可以获取我们想要的。
另一种解决思路:
其实今天我也想到了另一种解决办法,因为这个地方的关键是不知道文件名,导致无法读取,而文件名是动态可变的,我的思路是我们可以将制定的文件夹下面的文件名先读出来,写进一个json中,这个json文件在配置文件中,每次启动的时候如果时本地就刷新下json,如果是服务器就直接读取。有人说这是投机取巧,先把功能实现再追求完美。如果没有第一种解决方案,我就采用第二种了。
问题记录一项目打包后读取配置文件所在文件夹的文件名
最新推荐文章于 2024-01-18 20:54:38 发布