• Java获取Jar、War包路径,并生成可编辑修改的本地配置文件


    前言

    本地的可修改配置文件的编写理应是一个很常用的功能,但由于数据库的存在,它鲜少被提及,大多数我们直接存储到数据库中了。

    以至于现今,除了没接触数据库的新手时常使用它以外,它没有太多的出场机会。
    也因此,其实很多人不太了解其中的存储机制以及可能存在的一些坑。

    不过也有适合用本地配置的时候,例如我遇到了一个场景,需要保存一个邮箱格式,这个格式当然不会经常变化,因而存储到数据库不太方便,尤其我用的是关系型数据库MYSQL,存起来感觉很别扭。如果存到Redis中,一旦服务宕机,数据就会消失,虽然并不是很重要的数据,但也不是很好的解决方案。

    分析

    要了解如何生成一个本地的可编辑配置文件,首先就得想清楚文件应该放在哪?

    新手可能会直接回答,这还不简单,直接跟代码一样放classes目录下不就得了。

    答案显然是不行的,因为jar包本质上是一个压缩包,如果你放在IDE中直接运行,那么不会有任何问题,但是一旦你需要打jar包或者war包。你就无法动态的去修改Jar包中的内容,这点很容易理解。

    所以,比较科学的方法,就是在Jar/War包的同级目录下,新建一个配置文件。

    1.获取Jar包同级目录

    如何获取Jar包的同级目录,可以使用jdk提供的Protection Domain
    以下代码可以得到当前代码源的位置,简单来说,就是编译生成的classes目录。

    File file=new File file=new File(this.getClass().getProtectionDomain().getCodeSource().getLocation().getFile());
    
    • 1

    但是要得到想要的Jar包路径还没有那么简单,因为这里有一个坑,在IDE中直接运行和打成Jar包后运行的效果是不同的。

    例如以下的这段演示代码:

    String name = new String("history.json");
    File file=new File(this.getClass().getProtectionDomain().getCodeSource().getLocation().getFile());
    System.out.println(file.toString());
    String jarPath = file.getParentFile().getParent();//jar所在文件夹路径
    System.out.println("jarPath: " + jarPath);
    String resource = jarPath + File.separator +name;
    System.out.println(resource);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    (1)IDE中

    在这里插入图片描述

    (2)windows下运行Jar

    在这里插入图片描述

    (3)Linux下运行Jar

    在这里插入图片描述

    路径问题总结

    由此,我们得出一个结论,上述获取jar包路径的代码,在IDE中运行的效果和打包后运行效果不同,且打包后Windows和Linux运行效果基本一致。

    我们想要的Jar文件夹路径,需要向上获取三次父目录,正确的在打包后获取Jar包路径的代码应该如下:
    resource即我们需要的配置文件路径,使用File.seperator是为了不同平台的适配性。

    String name = new String("history.json");
    File file=new File(this.getClass().getProtectionDomain().getCodeSource().getLocation().getFile());
    File jarPath = file.getParentFile().getParentFile().getParentFile().getParentFile();//jar所在文件夹路径
    String resource = jarPath.getPath().replace("file:","") + File.separator +name;
    
    • 1
    • 2
    • 3
    • 4

    2.读取与修改配置文件

    有了对应的配置文件路径,那么就很轻松了。

    考虑到配置文件一般是Properties或Yaml格式,这里以Java本身支持的Properties为例。

    使用字符流读取较为方便,因其可以自动处理编码问题。

    例如:

     //使用properties
            Reader reader =new FileReader(config);
            Properties properties = new Properties();
            properties.load(reader);
    
            System.out.println(properties.getProperty("last-update"));
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    总结

    Java获取Jar、war包路径的可行方法是通过Protection Domain,在使用时要注意不同平台的微小差异,掌握了这个方法,不但可以用来写配置文件,也可以用来存储下载的图片、视频等内容,因而尤其对客户端应用的开发人员来说,十分有必要去了解。

  • 相关阅读:
    基于Struts2+Hibernate开发学生信息管理系统(选课)
    标定板生成网址,可以直接打印,matlab标定工具箱
    Java ByteArrayOutputStream类简介说明
    生成元 rust解法
    计算机毕业设计 基于SpringBoot大学生创新创业项目管理系统的设计与实现 Javaweb项目 Java实战项目 前后端分离 文档报告 代码讲解 安装调试
    化合物纯度、溶剂溶解度检测
    月销破30万辆后,比亚迪整了波大的
    持续更新|2022年度国家杰青、优青最新统计名单公布(附最新榜单)
    Survey summary for 3D pose estimatation
    结构体初阶
  • 原文地址:https://blog.csdn.net/highlighters/article/details/134432904