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

news2024/9/20 9:39:17

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Python循环4/5】跳出循环的办法

目录 导入 break 具体用法 在for循环中的运用 在while循环中的运用 continue 具体用法 区别 总结 导入 前几天的博文里&#xff0c;我们学习了for循环和while循环。 无论是for循环还是while循环&#xff0c;默认的终止条件都是边界条件。在触发边界条件之前&am…

ChatGPT4的Dalle-3 生成电影海报及升级教程

引言 首先DALL E3首先需要升级为ChatGPT4才能使用&#xff0c;接下来从以下几个方面进行介绍&#xff1a; 一、ChatGPT4中的DALL E3 的电影海报二、ChatGPT4下的DALL E3的实例三、ChatGPT4的升级教程 一、ChatGPT4中的DALL E3 的电影海报 DALLE 3可以直接在画面中识别和生成…

gPTP简介

1、gPTP&#xff08;generalized precision time protocol&#xff09;广义时钟同步协议 gPTP&#xff08;generalized precision time protocol&#xff09;广义时钟同步协议&#xff0c;即IEEE 802.1AS协议。它是IEEE 1588协议的延伸&#xff0c;可以为TSN提供全局精准…

重磅!知名三甲医院更新2024预警期刊名单!1区SCI为何上榜?

毕业推荐 SSCI&#xff08;ABS一星&#xff09; • 社科类&#xff0c;3.0-4.0&#xff0c;JCR2区&#xff0c;中科院3区 • 13天录用&#xff0c;28天见刊&#xff0c;13天检索 SCIE&#xff1a; • 计算机类&#xff0c;6.5-7.0&#xff0c;JCR1区&#xff0c;中科院2区…

C到C++的敲门砖-2

文章目录 引用内联函数auto关键字基于范围的for循环指针空值nullptr后记 引用 引用不是新定义一个变量&#xff0c;而是给已存在变量取了一个别名&#xff0c;编译器不会为引用变量开辟内存空 间&#xff0c;它和它引用的变量共用同一块内存空间。 所谓引用就是给变量起别名&am…

基于消失点的相机自标定

基于消失点的相机自标定 附赠最强自动驾驶学习资料&#xff1a;直达链接 相机是通过透视投影变换来将3D场景转换为2D图像。在射影变换中&#xff0c;平行线相交于一点称之为消失点。本文详细介绍了两种利用消失点特性的标定方法。目的是为根据实际应用和初始条件选择合适的标…

phpStudy安装thinkCMF8时,如何解决服务器rewrite和APIrewrite不支持的问题

解决步骤&#xff1a; 一&#xff1a;服务器rewrite 点击后面的问号跳转到官方文档链接&#xff1a; 复制红框内的代码 打开phpstudy&#xff0c;找到配置的站点&#xff0c;点击管理&#xff0c;找到伪静态 点击确认保存即可。 phpstudy会自动重启站点。 此时&#xff0c;…

CTF 题型 SSRF攻击例题总结

CTF 题型 SSRF攻击&例题总结 文章目录 CTF 题型 SSRF攻击&例题总结Server-side Request Forgery 服务端请求伪造SSRF的利用面1 任意文件读取 前提是知道要读取的文件名2 探测内网资源3 使用gopher协议扩展攻击面Gopher协议 &#xff08;注意是70端口&#xff09;python…

RPC学习笔记一

什么是RPC RPC&#xff08;Remote Procedure Call&#xff0c;远程过程调用&#xff09;是一种用于实现分布式系统中不同计算机或进程之间进行通信和调用的技术和模式。 在传统的过程调用中&#xff0c;当一个程序需要调用另一个程序的函数或方法时&#xff0c;通常是在同一台…

【10】进阶常用第三方库

第三方库概览 名称文档一句话介绍jQuery官网:https://jquery.com/中文网:https://jquery.cuishifeng.cn/让操作 DOM 变得更容易Lodash官网:https://lodash.com/docs中文网:https://www.lodashjs.com/你能想到的工具函数它都帮你写了Animate.css官网:https://animate.style…

图算法总结

BFS: 基于队列, 入队列的顶点先被探索. DFS: 基于栈, 通过将顶点存入栈中, 顶点是沿着路径被探索的, 存在新的相邻顶点就去访问.深度优先遍历类似于树的先根遍历(先序遍历)

大模型提示学习样本量有玄机,自适应调节方法好

引言&#xff1a;探索文本分类中的个性化示例数量 在自然语言处理&#xff08;NLP&#xff09;领域&#xff0c;预测模型已经从零开始训练演变为使用标记数据对预训练模型进行微调。这种微调的极端形式涉及到上下文学习&#xff08;In-Context Learning, ICL&#xff09;&…

由浅到深认识Java语言(1):前提概要

该文章Github地址&#xff1a;https://github.com/AntonyCheng/java-notes 在此介绍一下作者开源的SpringBoot项目初始化模板&#xff08;Github仓库地址&#xff1a;https://github.com/AntonyCheng/spring-boot-init-template & CSDN文章地址&#xff1a;https://blog.c…

外贸网站常用的wordpress模板

零件配件WordPress外贸建站模板 汽车行业零配件WordPress外贸建站模板&#xff0c;卖配件、零件的外贸公司可以使用的WordPress主题。 https://www.jianzhanpress.com/?p4912 WordPress外贸独立站主题 简洁实用的WordPress外贸独立站主题&#xff0c;适合时尚服装行业搭建w…

哈尔滨华时信息公司的校企合作怎么样

在当今竞争激烈的就业市场中&#xff0c;大学生的技能培养对于他们的未来职业发展至关重要。哈尔滨华时信息技术有限公司与黑龙江农业工程职业学院信息工程院的合作&#xff0c;无疑是一次具有深远意义的举措。这样的校企合作模式不仅符合国家政策导向&#xff0c;更带来了多方…

第四百零九回

文章目录 1. 概念介绍2. 方法与细节2.1 获取方法2.2 使用细节 3. 示例代码4. 内容总结 我们在上一章回中介绍了"如何获取当前系统语言"相关的内容&#xff0c;本章回中将介绍如何获取时间戳.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 概念介绍 我们在本章…

java新手练习-类的继承调用(接口,抽象类,构造函数)和枚举定义方法

1.继承 父类可以调用子类实例对象,(对于调用抽象类必须使用继承) 模版 //抽象定义一个父类抽象类 abstract class FatherAbstract{void showFatherAbstract(String color, String name, int age, double serail_abstract){System.out.println("color " color &…

鸿蒙App开发学习 - TypeScript编程语言全面开发教程(上)

背景 根据鸿蒙官方的说明&#xff1a; ArkTS是HarmonyOS优选的主力应用开发语言。ArkTS围绕应用开发在TypeScript&#xff08;简称TS&#xff09;生态基础上做了进一步扩展&#xff0c;继承了TS的所有特性&#xff0c;是TS的超集。因此&#xff0c;在学习ArkTS语言之前&#…

我的尝试:Codigger + Vim

若您愿意耐心投入&#xff0c;学习 Vim 的过程其实远比想象中轻松。我对 Vim 产生兴趣&#xff0c;主要是源于它对提升生产力的巨大潜力。我尝试了 Neovim、NvChad 以及 Codigger Vim 插件&#xff0c;如今我的工作效率已远超从前。 那么&#xff0c;Vim 究竟是什么呢&#xff…

交叉注意力融合时空特征的TCN-Transformer并行预测模型

独家 | 高创新预测模型 往期精彩内容&#xff1a; 时序预测&#xff1a;LSTM、ARIMA、Holt-Winters、SARIMA模型的分析与比较-CSDN博客 风速预测&#xff08;一&#xff09;数据集介绍和预处理-CSDN博客 风速预测&#xff08;二&#xff09;基于Pytorch的EMD-LSTM模型-CSDN博…