当前位置: 首页 > news >正文

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());

但是要得到想要的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)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();//jar所在文件夹路径
String resource = jarPath.getPath().replace("file:","") + File.separator +name;

2.读取与修改配置文件

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

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

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

例如:

 //使用propertiesReader reader =new FileReader(config);Properties properties = new Properties();properties.load(reader);System.out.println(properties.getProperty("last-update"));

总结

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

相关文章:

  • levelDB之基础数据结构-Slice
  • 使用 React Flow 构建一个思维导图应用
  • 【2022改良版】学法减分助手PRO小程序源码
  • 深度学习(五)softmax 回归之:分类算法介绍,如何加载 Fashion-MINIST 数据集
  • 内网穿透 cpolar
  • mysql查询json字符串内容
  • 基于java web的中小型人力资源管理系统
  • LuatOS-SOC接口文档(air780E)--nimble - 蓝牙BLE库(nimble版)
  • 【SpringBoot篇】分页查询 | 扩展SpringMvc的消息转换器
  • 「引流工具」火炬多平台多功能引流高效推广脚本,抖音+快手+小红书多平台自动引流软件
  • 【人工智能Ⅰ】7-KNN 决策树
  • IDEA远程一键部署SpringBoot到Docker
  • Qt控件按钮大全
  • 【佳学基因检测】在LARAVEL中如何使用和设置路由组
  • <MySQL> 什么是数据库事务?事务该如何使用?
  • 【Under-the-hood-ReactJS-Part0】React源码解读
  • 【许晓笛】 EOS 智能合约案例解析(3)
  • 78. Subsets
  • Apache Zeppelin在Apache Trafodion上的可视化
  • CSS盒模型深入
  • iOS仿今日头条、壁纸应用、筛选分类、三方微博、颜色填充等源码
  • Lucene解析 - 基本概念
  • MySQL几个简单SQL的优化
  • Python socket服务器端、客户端传送信息
  • spring cloud gateway 源码解析(4)跨域问题处理
  • UMLCHINA 首席专家潘加宇鼎力推荐
  • 测试开发系类之接口自动化测试
  • 官方新出的 Kotlin 扩展库 KTX,到底帮你干了什么?
  • 理清楚Vue的结构
  • 前端每日实战 2018 年 7 月份项目汇总(共 29 个项目)
  • 如何实现 font-size 的响应式
  • 使用API自动生成工具优化前端工作流
  • 突破自己的技术思维
  • 线性表及其算法(java实现)
  • 阿里云移动端播放器高级功能介绍
  • 如何在 Intellij IDEA 更高效地将应用部署到容器服务 Kubernetes ...
  • ​LeetCode解法汇总518. 零钱兑换 II
  • # 安徽锐锋科技IDMS系统简介
  • #162 (Div. 2)
  • ${ }的特别功能
  • (10)STL算法之搜索(二) 二分查找
  • (Redis使用系列) SpringBoot 中对应2.0.x版本的Redis配置 一
  • (ros//EnvironmentVariables)ros环境变量
  • (vue)页面文件上传获取:action地址
  • (动态规划)5. 最长回文子串 java解决
  • (附源码)ssm航空客运订票系统 毕业设计 141612
  • (蓝桥杯每日一题)平方末尾及补充(常用的字符串函数功能)
  • .libPaths()设置包加载目录
  • .NET 4.0中的泛型协变和反变
  • .NET Framework 的 bug?try-catch-when 中如果 when 语句抛出异常,程序将彻底崩溃
  • .Net 代码性能 - (1)
  • .net 调用php,php 调用.net com组件 --
  • .net 逐行读取大文本文件_如何使用 Java 灵活读取 Excel 内容 ?
  • @AliasFor注解
  • @Bean有哪些属性