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("*/");// tomcat
                if (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 chars
                    jarFile = 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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/468029.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

计算机网络:TCP篇

计网tcp部分面试总结 tcp报文格式&#xff1a; 序列号&#xff1a;通过SYN传给接收端&#xff0c;当SYN为1&#xff0c;表示请求建立连接&#xff0c;且设置序列号初值&#xff0c;后面没法送一次数据&#xff0c;就累加数据大小&#xff0c;保证包有序。 确认应答号&#x…

算法——贪心算法

《算法图解》——贪心算法 # 首先创建一个表&#xff0c;包含所覆盖的州 states_needed set([mt,wa,or,id,nv,ut,az]) # 传入一个数组&#xff0c;转换成一个集合#可供选择的广播台清单 stations {} stations[kone] set([id,nv,ut]) #用集合表示想要覆盖的州&#xff0c;且不…

【IC设计】Verilog线性序列机点灯案例(四)(小梅哥课程)

文章目录 该系列目录&#xff1a;设计环境设计目标设计思路RTL及Testbench代码RTL代码Testbenchxdc约束 仿真结果 声明&#xff1a;案例和代码来自小梅哥课程&#xff0c;本人仅对知识点做做笔记&#xff0c;如有学习需要请支持官方正版。 该系列目录&#xff1a; Verilog线性…

ChatGPT是什么,怎么使用,需要注意些什么?

一、ChatGPT 是什么&#xff1f; ChatGPT&#xff0c;全称聊天生成预训练转换器&#xff08;Chat Generative Pre-trained Transformer&#xff09;&#xff0c;是 OpenAI 开发的人工智能(AI)聊天机器人程序&#xff0c;于2022年11月推出。该程序使用基于GPT-3.5、GPT-4架构的…

编写一个sum函数,由用户输入参数n,并计算1到n的整数和--c语言

#include<stdio.h> int sum(int n); int sum(int n) {int result0;do{resultresultn;//先从n开始加}while(n-->0);return result; }int main() {int n,result;printf("请输入参数");scanf("%d",&n);printf("结果是&#xff1a;%d",…

【腾讯云 TDSQL-C Serverless 产品体验】TDSQL-C MySQL Serverless实践之路

【腾讯云 TDSQL-C Serverless 产品体验】TDSQL-C MySQL Serverless实践之路 腾讯云TDSQL-C联合CSDN推出了一款云数据库产品测评活动&#xff0c;让我们一起来体验一下。 一、什么是云数据库&#xff1f; 云数据库是指被优化或部署到一个虚拟计算环境中的数据库&#xff0c;可以…

数码管的动态显示(四)

1.原理 2.代码 2.1 seg_595_dynamic.v module seg_595_dynamic(input wire sys_clk ,input wire sys_rst_n ,input wire[19:0] data ,input wire[5:0] point ,input wire sign ,input wire seg_en ,output wire ds ,output wire oe…

.htaccess全站设置SSL,wordpress全站设置SSL,网站重定向的次数过多”错误最佳解决方法教程

.htaccess全站设置SSL,wordpress全站设置SSL&#xff0c;网站重定向的次数过多”错误最佳解决方法教程 网上找了很多教程网无效**.htacces**设置&#xff0c;访问后台出现重定向次数过多&#xff0c;导致无法访问 找了好久&#xff0c;测试用AI机器人无法解决&#xff0c;参考…

基于PyTorch的视频分类实战

1、数据集下载 官方链接&#xff1a;https://serre-lab.clps.brown.edu/resource/hmdb-a-large-human-motion-database/#Downloads 百度网盘连接&#xff1a; https://pan.baidu.com/s/1sSn--u_oLvTDjH-BgOAv_Q?pwdxsri 提取码: xsri 官方链接有详细的数据集介绍&#xf…

ASP .Net Core 8.0 依赖注入的三种注入模式

&#x1f433;前言 &#x1f340;在.NET中&#xff0c;依赖注入&#xff08;Dependency Injection&#xff0c;简称DI&#xff09;是一种设计模式&#xff0c;用于解耦组件之间的依赖关系。 依赖注入的核心思想是将对象的依赖关系&#xff08;即对象所需的其他服务或组件&#…

【系统架构设计师】软件架构设计 02

系统架构设计师 - 系列文章目录 01 系统工程与信息系统基础 02 软件架构设计 文章目录 系统架构设计师 - 系列文章目录 文章目录 前言 一、软件架构的概念 ★★★ 二、基于架构的软件开发 ★★★★ 三、软件架构风格 ★★★★ 1.数据流风格 2.调用/返回风格 3.独立构件风格…

鸿蒙Harmony应用开发—ArkTS声明式开发(绘制组件:Polygon)

多边形绘制组件。 说明&#xff1a; 该组件从API Version 7开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 子组件 无 接口 Polygon(value?: {width?: string | number, height?: string | number}) 从API version 9开始&#xff0…

面试经典150题【81-90】

文章目录 面试经典150题【81-90】530.二叉搜索树的最小绝对差值230.二叉搜索树中第k小的元素98.验证二叉搜索树92.反转链表II25.K个一组翻转链表146.LRU缓存909. 蛇梯棋&#xff08;未做&#xff09;433.最小基因变化127.单词接龙&#xff08;未做&#xff09;17.电话号码的字母…

C++Qt学习——QFile、QPainter、QChart

目录 1、QFile&#xff08;文本读写&#xff09;——概念 1.1、拖入三个控件&#xff0c;对pushButton进行水平布局&#xff0c;之后整体做垂直布局 1.2、按住控件&#xff0c;转到槽&#xff0c;写函数 1.3、打开文件控件 A、首先引入以下两个头文件 B、设置点击打开文件控…

c语言,联合体

一.什么是联合体&#xff1a; 像结构体一样&#xff0c;联合体也是由一个或多个成员变量组成的这些成员变量可以是不同的类型&#xff0c;但编译器只给最大成员分配足够的内存&#xff0c;联合体体内的成员都是公用一块空间的&#xff0c;因此联合体也叫做共同体 二.联合体类…

MySql安装与卸载—我耀学IT

1.MySql安装 打开下载的mysql安装文件mysql-5.5.27-win32.zip&#xff0c;双击解压缩&#xff0c;运行“setup.exe”。 选择安装类型&#xff0c;有“Typical&#xff08;默认&#xff09;”、“Complete&#xff08;完全&#xff09;”、“Custom&#xff08;用户自定义&…

04|调用模型:使用OpenAI API还是微调开源Llama2/ChatGLM?

大语言模型发展史 Transformer是几乎所有预训练模型的核心底层架构。基于Transformer预训练所得的大规模语言模型也被叫做“基础模型”&#xff08;Foundation Model 或Base Model&#xff09;。 在预训练模型出现的早期&#xff0c;BERT毫无疑问是最具代表性的&#xff0c;也…

HTTP 工作流程请求响应 - 面试常问

文章目录 HTTP 工作流程请求和响应格式HTTP请求格式请求行&#xff1a;请求头部字段&#xff1a;空行&#xff1a;消息正文&#xff08;请求正文&#xff09;&#xff1a; HTTP响应格式状态行&#xff1a;响应头部字段&#xff1a;空行&#xff1a; HTTP方法HTTP状态码常用HTTP…

详解基于快速排序算法的qsort的模拟实现

目录 1. 快速排序 1.1 快速排序理论分析 1.2 快速排序的模拟实现 2. qsort的模拟实现 2.1 qsort的理论分析 2.2 qsort的模拟实现 qsort函数是基于快速排序思想设计的可以针对任意数据类型的c语言函数。要对qsort进行模拟实现&#xff0c;首先就要理解快速排序。 1. 快…

Odoo17免费开源ERP开发技巧:如何在表单视图中调用JS类

文/Odoo亚太金牌服务开源智造 老杨 在Odoo最新V17新版中&#xff0c;其突出功能之一是能够构建个性化视图&#xff0c;允许用户以独特的方式与数据互动。本文深入探讨了如何使用 JavaScript 类来呈现表单视图来创建自定义视图。通过学习本教程&#xff0c;你将获得关于开发Odo…