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

jar读取目录配置、打包jar后无法获取目录下的配置

jar读取目录配置、打包jar后无法获取目录下的配置

jar读取目录配置、打包jar后无法获取目录下的配置。java打成jar包后获取不到配置文件路径。解决项目打成jar包上线无法读取配置文件。打包jar后无法读取resource下的配置文件

场景

需要读取 src/main/resources/mapper下的所有 xml 配置。

前提

代码打包成jar,查看这篇文章:https://lingkang.top/archives/idea-yuan-cheng-shi-diao-jar

原代码

import java.io.File;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;/*** @author lingkang* @create by 2024/3/18 14:44*/
public class Test05 {public static void main(String[] args) {String scanPath="mapper";List<String> result=new ArrayList<>();// 直接遍历,此时可能是idea、eclipse开发环境。URL resource = Test04.class.getClassLoader().getResource("");if (resource != null) {File file = new File(resource.getPath() + scanPath);if (file.listFiles() != null)for (File f : file.listFiles()) {result.add(f.getPath());}}// 输出扫描结果System.out.println(result);// 加载配置/*for (String config:result){InputStream inputStream = Test04.class.getClassLoader().getResourceAsStream(config);}*/}
}

image-1710744353286

打包成jar后运行

java -jar mybatis-magic-test.jar

如何打包成jar请查看这篇文章:https://lingkang.top/archives/idea-yuan-cheng-shi-diao-jar

image-1710744419051

这时候获取到的是空值。

远程试调

如何试调jar,查看这篇文章:https://lingkang.top/archives/idea-yuan-cheng-shi-diao-jar

image-1710744615862

可以看到获取到是一个空对象

spring的底层原理

spring的底层实现是:PathMatchingResourcePatternResolver,它分多种情况,但总的来说,通配符时(例如/mapper/*.xml),是通过对jar所有文件进行遍历匹配。

解决打包jar后无法获取目录下的配置

import java.io.File;
import java.net.JarURLConnection;
import java.net.URL;
import java.net.URLConnection;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;/*** @author lingkang* @create by 2024/3/18 14:14*/
public class Test04 {public static void main(String[] args) throws Exception {String scanPath = "mapper";List<String> result = scanResource(scanPath);// 输出扫描结果System.out.println(result);// 加载配置/*for (String config:result){InputStream inputStream = Test04.class.getClassLoader().getResourceAsStream(config);}*/}public static List<String> scanResource(String scanPath) throws Exception {URL url = Test04.class.getClassLoader().getResource(scanPath);List<String> result = new ArrayList<>();if (url != null) {JarFile jarFile = null;URLConnection con = url.openConnection();if (con instanceof JarURLConnection) {JarURLConnection jarCon = (JarURLConnection) con;jarFile = jarCon.getJarFile();} else {// 手动接收结果String urlFile = url.getFile();int separatorIndex = urlFile.indexOf("*/");// tomcatif (separatorIndex == -1) {separatorIndex = urlFile.indexOf("!/");// jar}if (separatorIndex != -1) {// String jarFileUrl = urlFile.substring(0, separatorIndex);String rootEntryPath = urlFile.substring(separatorIndex + 2);  // both separators are 2 charsjarFile = new JarFile(rootEntryPath);}}// 遍历if (jarFile != null) {boolean has = false;for (Enumeration<JarEntry> entries = jarFile.entries(); entries.hasMoreElements(); ) {JarEntry entry = entries.nextElement();String entryPath = entry.getName();// 名称匹配,可以是 ant、正则if (entryPath.startsWith(scanPath)) {result.add(entryPath);has = true;} else {if (has) {break;}}}jarFile.close();} else {// 直接遍历,此时可能是idea、eclipse开发环境。URL resource = Test04.class.getClassLoader().getResource("");if (resource != null) {File file = new File(resource.getPath() + scanPath);if (file.listFiles() != null)for (File f : file.listFiles()) {result.add(f.getPath());}}}}return result;}
}

直接在idea运行,能正常获取到结果

image-1710744982469

打包jar再运行:

image-1710745058003

也能获取到结果,这对框架开发有所帮助。

相关文章:

jar读取目录配置、打包jar后无法获取目录下的配置

jar读取目录配置、打包jar后无法获取目录下的配置 jar读取目录配置、打包jar后无法获取目录下的配置。java打成jar包后获取不到配置文件路径。解决项目打成jar包上线无法读取配置文件。打包jar后无法读取resource下的配置文件 场景 需要读取 src/main/resources/mapper下的所…...

python第三次项目作业

打印课堂上图案 判断一个数是否是质数&#xff08;素数&#xff09; 设计一个程序&#xff0c;完成(英雄)商品的购买&#xff08;界面就是第一天打印的界面&#xff09; 展示商品信息(折扣)->输入商品价格->输入购买数量->提示付款 输入付款金额->打印购买小票&a…...

架构之安全性维度

流程安全性 安全基本原则&#xff1a;可用性 完整性 机密性 CIA 安全框架&#xff1a;zachman P2DR Sabsa IPDRR IATF 安全评估方法&#xff1a;安全测试&#xff1a; SAST静态测试、 IAST交互测试 安全扫描 危险模型&#xff1a;攻击树分析 DREAD风险评估 渗透测试&#xff1a…...

odoo字段访问控制

在 Odoo 中&#xff0c;可以通过几种方式实现字段的访问控制&#xff0c;包括通过模型安全规则、记录规则和字段属性来限制字段的访问。 1. 使用模型安全规则 模型安全规则&#xff08;也称为访问控制列表&#xff0c;ACLs&#xff09;允许你定义哪些用户组可以对哪些模型进行…...

mysql的基本知识点-操作数据库表

创建数据库&#xff1a; CREATE DATABASE database_name;创建一个名字为database_name的数据库&#xff1b; 删除数据库&#xff1a; DROP DATABASE database_name;删除名字为database_name的数据库&#xff1b; 在执行删除数据库操作前&#xff0c;请确保你确实想要删除数据…...

基于Springboot的疫情物资管理系统(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的疫情物资管理系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构…...

【postgresql 基础入门】表的约束(一)主键与外键,数据的实体完整性与参照完整性,外键引用数据被修改时的动作触发

主键与外键-表的约束(一) ​专栏内容&#xff1a; postgresql内核源码分析手写数据库toadb并发编程 个人主页&#xff1a;我的主页 管理社区&#xff1a;开源数据库 座右铭&#xff1a;天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物. 系列文章…...

centos 7 添加启动脚本

centos 7 java 开机启动 在CentOS 7上配置Java应用程序开机启动&#xff0c;可以通过创建一个systemd服务单元来实现。以下是步骤和示例代码&#xff1a; 创建一个新的systemd服务文件。 sudo vi /etc/systemd/system/your-java-app.service 在该文件中添加以下内容&#xff…...

java入门基础掌握知识

Java基础入门 Java一门 高级 编程语言 Java是 sun 公司研发的&#xff0c;现在属于 oracle 公司 Java之父是 詹姆斯.高斯林 Java主要是来做 企业级 应用开发的 Java的三大技术体系是&#xff1a; 技术体系说明Java SE(Java Standard Edition):标准版Java技术的核心和基础…...

Harbor高可用(nginx和keepalived)

Harbor高可用&#xff08;nginx和keepalived&#xff09; 文章目录 Harbor高可用&#xff08;nginx和keepalived&#xff09;1.Harbor高可用集群部署架构1.1 主机初始化1.1.1 设置网卡名和ip地址1.1.2 设置主机名1.1.3 配置镜像源1.1.4 关闭防火墙1.1.5 禁用SELinux1.1.6 设置时…...

[数据集][目标检测]牛羊检测数据集VOC+YOLO格式3393张2类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;3393 标注数量(xml文件个数)&#xff1a;3393 标注数量(txt文件个数)&#xff1a;3393 标注…...

命令提示符——CMD基础操作介绍

&#x1f49e;&#x1f49e; 前言 hello hello~ &#xff0c;这里是大耳朵土土垚~&#x1f496;&#x1f496; &#xff0c;欢迎大家点赞&#x1f973;&#x1f973;关注&#x1f4a5;&#x1f4a5;收藏&#x1f339;&#x1f339;&#x1f339; &#x1f4a5;个人主页&#x…...

vue2 自定义 v-model (model选项的使用)

效果预览 model 选项的语法 每个组件上只能有一个 v-model。v-model 默认会占用名为 value 的 prop 和名为 input 的事件&#xff0c;即 model 选项的默认值为 model: {prop: "value",event: "input",},通过修改 model 选项&#xff0c;即可自定义v-model …...

智慧城市中的智慧生活:便捷、舒适与高效

目录 一、智慧城市中的智慧生活概述 二、智慧生活带来的便捷性 1、智慧交通的便捷出行 2、智慧购物的轻松体验 3、智慧政务的一站式服务 三、智慧生活带来的舒适性 1、智慧环境的绿色宜居 2、智慧医疗的健康保障 3、智慧教育的均衡发展 四、智慧生活带来的高效性 1、…...

时代教育期刊投稿发表

《时代教育》是由成都传媒集团主管主办&#xff0c;中华人民共和国新闻出版总署批准国内公开出版发行的专业教育类期刊&#xff0c;主要刊登各类高等院校、职业技术学校、中小学教师及研究生、教育科研工作者的教育实践研究成果&#xff1b;教育教学行业的最新动态&#xff1b;…...

每日OJ题_子数组子串dp⑥_力扣978. 最长湍流子数组

目录 力扣978. 最长湍流子数组 解析代码 力扣978. 最长湍流子数组 978. 最长湍流子数组 难度 中等 给定一个整数数组 arr &#xff0c;返回 arr 的 最大湍流子数组的长度 。 如果比较符号在子数组中的每个相邻元素对之间翻转&#xff0c;则该子数组是 湍流子数组 。 更正…...

蓝桥练习题总结(一)字母图形、完美的代价、01串、序列求和

目录 一、字母图形 二、完美的代价 三、01字串 四、序列求和 一、字母图形 问题描述 利用字母可以组成一些美丽的图形&#xff0c;下面给出了一个例子&#xff1a; ABCDEFG BABCDEF CBABCDE DCBABCD EDCBABC 这是一个5行7列的图形&#xff0c;请找出这个图形的规律&#xff…...

Android 静默安装二(无障碍服务版)

近期开发上线一个常驻app&#xff0c;项目已上线&#xff0c;今天随笔记录一下静默安装相关内容。我分三篇静默安装&#xff08;root版&#xff09;、静默安装&#xff08;无障碍版&#xff09;、监听系统更新、卸载、安装。 先说说我的项目需求&#xff1a;要求app一直运行&am…...

蓝桥杯 EDA 组 2023模拟+真题原理图解析

本文解析了标题内的原理图蓝桥杯EDA组真题&#xff0c;2021-2022 省赛真题/模拟题在上一篇文中。本文中重复或者是简单的电路节约篇幅不在赘述。 其中需要补充和计算原理图的题目解析都放在最下面 一、2023 年第十四届省赛模拟题1 1.1 Type-C 接口电路 通过 CH340N 将数据转化为…...

聊聊功率器件(氮化镓,碳化硅)

氮化镓和碳化硅是两种具有独特性质和广泛应用的无机物。下面将尽可能详细地解释它们的定义、应用、研究热点以及对我们的价值。 1&#xff0c;氮化镓 氮化镓&#xff08;GaN&#xff09;是一种由氮和镓元素组成的化合物&#xff0c;具有直接能隙的半导体特性。其结构类似于纤…...

Java如何权衡是使用无序的数组还是有序的数组

在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...

第25节 Node.js 断言测试

Node.js的assert模块主要用于编写程序的单元测试时使用&#xff0c;通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试&#xff0c;通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...

Nginx server_name 配置说明

Nginx 是一个高性能的反向代理和负载均衡服务器&#xff0c;其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机&#xff08;Virtual Host&#xff09;。 1. 简介 Nginx 使用 server_name 指令来确定…...

【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验

系列回顾&#xff1a; 在上一篇中&#xff0c;我们成功地为应用集成了数据库&#xff0c;并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了&#xff01;但是&#xff0c;如果你仔细审视那些 API&#xff0c;会发现它们还很“粗糙”&#xff1a;有…...

网络编程(UDP编程)

思维导图 UDP基础编程&#xff08;单播&#xff09; 1.流程图 服务器&#xff1a;短信的接收方 创建套接字 (socket)-----------------------------------------》有手机指定网络信息-----------------------------------------------》有号码绑定套接字 (bind)--------------…...

排序算法总结(C++)

目录 一、稳定性二、排序算法选择、冒泡、插入排序归并排序随机快速排序堆排序基数排序计数排序 三、总结 一、稳定性 排序算法的稳定性是指&#xff1a;同样大小的样本 **&#xff08;同样大小的数据&#xff09;**在排序之后不会改变原始的相对次序。 稳定性对基础类型对象…...

uniapp手机号一键登录保姆级教程(包含前端和后端)

目录 前置条件创建uniapp项目并关联uniClound云空间开启一键登录模块并开通一键登录服务编写云函数并上传部署获取手机号流程(第一种) 前端直接调用云函数获取手机号&#xff08;第三种&#xff09;后台调用云函数获取手机号 错误码常见问题 前置条件 手机安装有sim卡手机开启…...

【Linux系统】Linux环境变量:系统配置的隐形指挥官

。# Linux系列 文章目录 前言一、环境变量的概念二、常见的环境变量三、环境变量特点及其相关指令3.1 环境变量的全局性3.2、环境变量的生命周期 四、环境变量的组织方式五、C语言对环境变量的操作5.1 设置环境变量&#xff1a;setenv5.2 删除环境变量:unsetenv5.3 遍历所有环境…...

libfmt: 现代C++的格式化工具库介绍与酷炫功能

libfmt: 现代C的格式化工具库介绍与酷炫功能 libfmt 是一个开源的C格式化库&#xff0c;提供了高效、安全的文本格式化功能&#xff0c;是C20中引入的std::format的基础实现。它比传统的printf和iostream更安全、更灵活、性能更好。 基本介绍 主要特点 类型安全&#xff1a…...

命令行关闭Windows防火墙

命令行关闭Windows防火墙 引言一、防火墙:被低估的"智能安检员"二、优先尝试!90%问题无需关闭防火墙方案1:程序白名单(解决软件误拦截)方案2:开放特定端口(解决网游/开发端口不通)三、命令行极速关闭方案方法一:PowerShell(推荐Win10/11)​方法二:CMD命令…...