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().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,在使用时要注意不同平台的微小差异,掌握了这个方法,不但可以用来写配置文件,也可以用来存储下载的图片、视频等内容,因而尤其对客户端应用的开发人员来说,十分有必要去了解。
相关文章:
Java获取Jar、War包路径,并生成可编辑修改的本地配置文件
前言 本地的可修改配置文件的编写理应是一个很常用的功能,但由于数据库的存在,它鲜少被提及,大多数我们直接存储到数据库中了。 以至于现今,除了没接触数据库的新手时常使用它以外,它没有太多的出场机会。 也因此&am…...
FPGA UDP RGMII 千兆以太网(4)ARP ICMP UDP
1 以太网帧 1.1 1以太网帧格式 下图为以太网的帧格式: 前导码(Preamble):8 字节,连续 7 个 8’h55 加 1 个 8’hd5,表示一个帧的开始,用于双方 设备数据的同步。 目的 MAC 地址:6 字节,存放目的设备的物理地址,即 MAC 地址 源 MAC 地址:6 字节,存放发送端设备的…...
【视觉SLAM十四讲学习笔记】第二讲——初识SLAM
专栏系列文章如下: 【视觉SLAM十四讲学习笔记】第一讲 一个机器人,如果想要探索某一块区域,它至少需要知道两件事: 我在什么地方——定位周围环境是什么样——建图 一方面需要明白自身的状态(即位置)&#…...
Python交易-通过Financial Modeling Prep (FMP)选择行业
介绍 在您的交易旅程中,无论您是在寻找理想的股票、板块还是指标,做出明智的决策对于您的成功至关重要。然而,收集和分析所需的大量数据可能相当艰巨。财务建模准备 (FMP) API的...
AI创作系统ChatGPT网站源码+详细搭建部署教程+支持DALL-E3文生图/支持最新GPT-4-Turbo-With-Vision-128K多模态模型
一、AI创作系统 SparkAi创作系统是基于OpenAI很火的ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统,支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美,可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如…...
快速生成力扣链表题的链表,实现快速调试
关于力扣链表题需要本地调试创建链表的情况 我们在练习链表题,力扣官方需要会员,我们又不想开会员,想在本地调试给你们提供的代码 声明:本人也是参考的别人的代码,给你们提供不同语言生成链表 参考链接: 参…...
threejs(13)-着色器设置点材质
着色器材质内置变量 three.js着色器的内置变量,分别是 gl_PointSize:在点渲染模式中,控制方形点区域渲染像素大小(注意这里是像素大小,而不是three.js单位,因此在移动相机是,所看到该点在屏幕…...
计算机网络专栏 学习导航or使用说明
计算机网络各章笔记 计算机网络_第一章_计算机网络的概述 计算机网络_第二章_物理层 计算机网络_第三章_数据链路层 计算机网络_第四章网络层_网络层概述_网际协议IP 计算机网络各章习题 计算机网络第一章习题_网络概述 计算机网络第二章习题_物理层 计算机网络第三章习…...
git clone:SSL: no alternative certificate subject name matches target host name
git clone 时的常见错误: fatal: unable to access ‘https://ip_or_domain/xx/xx.git/’: SSL: no alternative certificate subject name matches target host name ‘ip_or_domain’ 解决办法: disable ssl verify git config --global http.sslVe…...
代码随想录图论|130. 被围绕的区域 417太平洋大西洋水流问题
130. 被围绕的区域 **题目:**给你一个 m x n 的矩阵 board ,由若干字符 ‘X’ 和 ‘O’ ,找到所有被 ‘X’ 围绕的区域,并将这些区域里所有的 ‘O’ 用 ‘X’ 填充。 题目链接:130. 被围绕的区域 解题思路:…...
Outlook无法显示阅读窗格
Outlook无法显示阅读窗格 故障现象 Outlook主界面不显示阅读窗格 故障截图 故障原因 阅读窗格被关闭 解决方案 1、打开Outlook - 视图 – 阅读窗格 2、选择“靠右”或者“底部”,正常显示阅读窗格...
tensorflow 1.15 gpu docker环境搭建;Nvidia Docker容器基于TensorFlow1.15测试GPU;——全流程应用指南
前言: TensorFlow简介 TensorFlow 在新款 NVIDIA Pascal GPU 上的运行速度可提升高达 50%,并且能够顺利跨 GPU 进行扩展。 如今,训练模型的时间可以从几天缩短到几小时 TensorFlow 使用优化的 C 和 NVIDIA CUDA 工具包编写,使模型能够在训练…...
一个22届被裁前端思想上得转变
距离上篇文章已经过去了三个多月,这个三个月,经历了技术攻坚,然后裁员,退房,回老家,找工作。短短的几个月,就经历社会的一次次毒打,特别是找工作,虽然算上实习我也有两年…...
Python开源项目GPEN——人脸重建(Face Restoration),模糊清晰、划痕修复及黑白上色的实践
无论是自己、家人或是朋友、客户的照片,免不了有些是黑白的、被污损的、模糊的,总想着修复一下。作为一个程序员 或者 程序员的家属,当然都有责任满足他们的需求、实现他们的想法。除了这个,学习了本文的成果,或许你还…...
Android studio2022.3项目中,底部导航菜单数多于3个时,只有当前菜单显示文本,其他非选中菜单不显示文本
在Android Studio 2022.3 中,底部导航菜单通常使用 BottomNavigationView 实现。默认情况下,当底部导航菜单中的标签数量超过三个时,非选中的标签将不会显示文本,而只会显示图标。 这是 Android 设计规范的一部分,旨在…...
使用 Redis 构建轻量的向量数据库应用:图片搜索引擎(二)
本篇文章我们来继续聊聊轻量的向量数据库方案:Redis,如何完成整个图片搜索引擎功能。 写在前面 在上一篇文章《使用 Redis 构建轻量的向量数据库应用:图片搜索引擎(一)》中,我们聊过了构建图片搜索引擎的…...
Java-贪吃蛇游戏
前言 此实现较为简陋,如有错误请指正。 其次代码中的图片需要自行添加地址并修改。 主类 public class Main {public static void main(String[] args) {new myGame();} }游戏类 import javax.swing.*; import java.awt.event.KeyEvent; import java.awt.event.…...
Python---数据序列类型之间的相互转换
list()方法:把某个序列类型的数据转化为列表 # 1、定义元组类型的序列 tuple1 (10, 20, 30) print(list(tuple1))# 2、定义一个集合类型的序列 set1 {a, b, c, d} print(list(set1))# 3、定义一个字典 dict1 {name:刘备, age:18, address:蜀中} print(list(dict1…...
gitlab 12.7恢复
一 摘要 本文主要介绍基于gitlab 备份包恢复gitlab 二 环境信息 科目老环境新环境操作系统centos7.3centos7.6docker19.0.319.0.3gitlab12.712.7 三 实施 主要有安装docker\docker-compose\gitlab 备份恢复三个文件 1.gitlab 配置文件gitlab.rb 2.gitlab 加密文件gitlab-s…...
将ECharts图表插入到Word文档中
文章目录 在后端调用JS代码准备ECharts库生成Word文档项目地址库封装本文示例 EChartsGen_DocTemplateTool_Sample 如何通过ECharts在后台生成图片,然后插入到Word文档中? 首先要解决一个问题:总所周知,ECharts是前端的一个图表库…...
TD-ACC+实验系统入门指南:手把手教你搭建典型环节模拟电路
TD-ACC实验系统实战手册:从零构建典型环节电路的21个关键细节 第一次接触TD-ACC实验系统时,看着密密麻麻的接口和旋钮,我的手指悬在半空迟迟不敢落下——生怕一个错误的连接就会烧毁昂贵的运算放大器。这种忐忑直到成功捕捉到第一个完美方波信…...
嵌入式轻量级任务调度框架cola_os解析与实践
1. 嵌入式轻量级任务调度框架cola_os深度解析在嵌入式开发中,我们经常面临一个经典困境:对于功能简单、实时性要求不高的多任务场景,使用完整的RTOS显得过于臃肿,而裸机轮询又难以维护。今天要介绍的cola_os正是为解决这个问题而生…...
别死记硬背了!一张图带你理清编译原理‘语法制导翻译’到‘代码优化’的核心链路
编译原理核心链路解析:从语法制导翻译到代码优化的实战指南 编译原理作为计算机科学的重要基石,常常让学习者感到知识点零散、难以形成系统认知。本文将以赋值语句为例,通过清晰的逻辑链路,展示从源代码到优化代码的完整编译过程&…...
PySide6多线程避坑指南:你的‘暂停’和‘停止’真的安全吗?
PySide6多线程避坑指南:你的‘暂停’和‘停止’真的安全吗? 在PySide6的多线程开发中,暂停和停止线程看似简单的操作背后,隐藏着许多开发者容易忽视的陷阱。本文将深入剖析这些潜在问题,并提供经过实战验证的安全解决方…...
CVPR 2025新作SAGE实战:用SAM语义先验+知识蒸馏,搞定红外与可见光图像融合
SAGE实战指南:如何将CVPR 2025前沿成果落地红外与可见光图像融合项目 在计算机视觉领域,多模态图像融合技术正经历着从传统方法到深度学习驱动的范式转变。2025年CVPR会议提出的SAGE(Semantic-Aware Guided Enhancement)方法&…...
GIL下的隐性内存竞争:多线程Python服务内存占用翻倍的底层机制(含perf火焰图验证)
第一章:Python 智能体内存管理策略 避坑指南Python 的内存管理看似“全自动”,实则暗藏诸多隐性陷阱——对象引用计数异常、循环引用导致的延迟回收、大对象驻留引发的内存碎片,以及多线程环境下 gc 模块行为不一致等问题,常在高并…...
cool-admin(midway版)前端错误处理:全局错误边界与日志上报
cool-admin(midway版)前端错误处理:全局错误边界与日志上报 【免费下载链接】cool-admin-midway 🔥 cool-admin(midway版)一个很酷的后台权限管理框架,模块化、插件化、CRUD极速开发,永久开源免费,基于midway.js 3.x、…...
手把手教你用Coze搭个‘论文小助理’:自动摘要、分类,还能给同组同学发Telegram周报
科研团队效率革命:用Coze构建智能论文协作系统 想象一下这样的场景:周五下午,当你的实验室成员正准备结束一周工作时,每个人的手机同时收到一条Telegram消息——本周团队收集的17篇前沿论文已自动完成摘要提取、关键词标记和分类存…...
Qwen3.5-9B-AWQ-4bit多模态落地:制造业设备铭牌识别→型号查询→维保文档匹配
Qwen3.5-9B-AWQ-4bit多模态落地:制造业设备铭牌识别→型号查询→维保文档匹配 1. 制造业设备管理的痛点与解决方案 在制造业设备管理中,设备铭牌识别、型号查询和维保文档匹配是三个关键但繁琐的环节。传统方式需要人工拍照、记录铭牌信息,…...
OWL ADVENTURE 作业批改场景应用:自动识别手写算式与批阅
OWL ADVENTURE 作业批改场景应用:自动识别手写算式与批阅 1. 引言 想象一下,一位数学老师晚上十点还在台灯下,面前堆着厚厚一摞作业本,需要逐题检查、打勾、画叉,再写上评语。日复一日,这种重复性劳动不仅…...
