为什么SpringBoot jar包中的文件读取不到?

sprinboot打包jar后读取不到/resource/data/ip2region.xdb的文件. FileUtils.copyInputStreamToFile(Objects.requireNonNull(in, "/data/ip2region.xdb文件找不到"), configFile);//获取类路径下的指定文件流 (项目目录下的: /resource/data/ip2region.xdb)log.info("保存文件数据文件ip2region失败({}): {}", ip, e);sprinboot打包jar后读取不到/resource/data/ip2region.xdb的文件. 阅读详情

1

 猿与故事 

今天的故事发生在程序猿菜菜身上。

凡是对接过三方的都知道,代码中难免要加载很多三方分配的证书等相关配置文件。

菜菜同学每天的工作便是与三方对接,而且这次的任务是接入 N 套证书相关配置文件。考虑到后期易于上线,于是菜菜开启了从硬编码到易维护的代码优化之路。

2

 情景再现 

由于特殊的接入诉求,需要获取到证书及属性文件的输入流,你平时都是怎么实现的呢?

f6ec6546ea3177ab23014734aa380e3b.png

菜菜同学代码实现如下。

public static boolean initEnv() {
    Map<InputStream, InputStream> map = Maps.newHashMap();


    InputStream certLsStream = NewB.class.getResourceAsStream("/cool/ls/cert_ls.key");
    InputStream configLsStream = NewB.class.getResourceAsStream("/cool/ls/config.properties");
    map.put(certLsStream, configLsStream);


    // ... ...
    // 采用 map 进行后续特殊操作(省略)
    // ... ...
    return true;
}

菜菜通过 Xxx.class.getResourceAsStream("") 轻松实现。

但是,后期业务扩展,三方接入的证书配置会很多,该怎么办?

这当然难不倒菜菜同学,发挥一下 CV 大法,于是乎一坨硬生生的代码出现了(估计有很多同学都这么干,🤭)。

public static boolean initEnv() {
    Map<InputStream, InputStream> map = Maps.newHashMap();


    InputStream certLsStream = NewB.class.getResourceAsStream("/cool/ls/cert_ls.key");
    InputStream configLsStream = NewB.class.getResourceAsStream("/cool/ls/config.properties");
    map.put(certLsStream, configLsStream);


    InputStream certZsStream = NewB.class.getResourceAsStream("/cool/zs/cert_zs.key");
    InputStream configZsStream = NewB.class.getResourceAsStream("/cool/zs/config.properties");
    map.put(certZsStream, configZsStream);


    InputStream certWwStream = NewB.class.getResourceAsStream("/cool/ww/cert_ww.key");
    InputStream configWwStream = NewB.class.getResourceAsStream("/cool/ww/config.properties");
    map.put(certWwStream, configWwStream);


    InputStream certSqStream = NewB.class.getResourceAsStream("/cool/sq/cert_sq.key");
    InputStream configSqStream = NewB.class.getResourceAsStream("/cool/sq/config.properties");
    map.put(certSqStream, configSqStream);


    InputStream certZlStream = NewB.class.getResourceAsStream("/cool/zl/cert_zl.key");
    InputStream configZlStream = NewB.class.getResourceAsStream("/cool/zl/config.properties");
    map.put(certZlStream, configZlStream);


    // ... ...
    // 采用 map 进行后续特殊操作(省略)
    // ... ...
    return true;
}

不过还真别说,虽然代码很粗糙,但是跑起来却很顺溜。

鉴于菜菜同学怀有一颗程序员的匠心,考虑到后期每次加证书,上线时都要修改代码,便开启代码改进之路。

b1b05eb26c771b5a208107d707aee3d0.png

代码该如何改进呢?如何灵活加载文件呢?菜菜同学陷入了思考。

思考 1:如何获取资源文件夹下所有的子目录?

思考 2:如何获取子目录下的 .key 以及 .properties 文件?

思考 3:如何获取文件对应的输入流?

通过一番思考,菜菜花了一根烟的功夫,把代码撸好了。

private static final String EXTENSIN_KEY = "key";
private static final String EXTENSIN_PROPERTIES = "properties";


public static boolean initEnv() {
    String parentPath = NewB.class.getResource("/cool").getPath();
    // 1. 获取 cool 目录下所有的子目录(ls、sq、ww等子目录)
    String[] subDirAry = FileUtil.listDirs(new File(parentPath));
    Map<InputStream, InputStream> map = Maps.newHashMap();
    for (String subDir : subDirAry) {
        String subFileDir = parentPath + "/" + subDir;
        // 2. 获取子目录下的 .key 以及 .properties 文件
        Collection files = FileUtils.listFiles(new File(subFileDir), new String[]{EXTENSIN_KEY, EXTENSIN_PROPERTIES}, false);
        // 3. 获取文件对应的输入流
        InputStream certInputStream = null;
        InputStream configInputStream = null;
        for (Object obj : files) {
            File subFile = (File) obj;
            if (EXTENSIN_KEY.equalsIgnoreCase(FilenameUtils.getExtension(subFile.getName()))) {
                certInputStream = new FileInputStream(subFile);
            } else if (EXTENSIN_PROPERTIES.equalsIgnoreCase(FilenameUtils.getExtension(subFile.getName()))) {
                configInputStream = new FileInputStream(subFile);
            }
        }
        // 4. 文件流放入map
        map.put(certInputStream, configInputStream);
    }


    // ... ...
    // 采用 map 进行后续特殊操作(省略)
    // ... ...
    return true;
}

菜菜在本地 Idea 跑起来贼爽,但是一部署到测试环境上就犯傻啦(与测试人员扯皮,怪环境不好使,笑傻)。

菜菜轻声嘀咕:「在本地 IDEA 程序跑着没问题,能够成功读取资源文件,单元测试都跑过了,为啥部署到测试环境就不好使了呢?」

菜菜边嘀咕边开启了 Debug 模式。

首先,发现 NewB.class.getResource("/cool").getPath() 输出的路径貌似跟想象中的不一样。

file:/app/yyxjService/lib/yyxj_service-0.0.1-SNAPSHOT.jar!/BOOT-INF/classes!/cool

然后,通过 FileUtil.listDirs(new File(parentPath)); 获取子目录文件夹结果确实空空如也。

问题很清晰了,通过上面这种方式获取 SpringBoot 打好的 jar 中的资源文件不太可行,需要换方案。

菜菜同学花费了很长时间,百思不得其解,最终找到 Spring 核心包提供的 PathMatchingResourcePatternResolver 类,感觉能解决问题。

private static final String EXTENSIN_KEY = "key";
private static final String EXTENSIN_PROPERTIES = "properties";


public static boolean initEnv() {
    try {
        Map<String, Map<String, InputStream>> resourceMap = Maps.newHashMap();


        // 1. 定义资源匹配规则,会在所有的JAR包的根目录下搜索指定文件
        String matchPattern = ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX + "/cool/*/*.*";
        // 2. 返回指定路径下所有的资源对象(子目录下的资源对象)
        ResourcePatternResolver resourcePatternResolver = new PathMatchingResourcePatternResolver();
        Resource[] resources = resourcePatternResolver.getResources(matchPattern);
        for (Resource resource : resources) {
            // 3. 获取文件名称
            String fileFlag = resource.getFilename().endsWith(EXTENSIN_KEY) ? EXTENSIN_KEY : EXTENSIN_PROPERTIES;
            // 4. 获取子目录名称
            String[] filePathAry = resource.getFile().getPath().split("/");
            String mb = filePathAry[filePathAry.length - 2];
            Map<String, InputStream> mbMap = resourceMap.get(mb);
            if (MapUtils.isEmpty(mbMap)) {
                mbMap = Maps.newHashMap();
                resourceMap.put(mb, mbMap);
            }
            mbMap.put(fileFlag, resource.getInputStream());
        }
        // 5. 封装资源文件流的Map
        Map<InputStream, InputStream> map = Maps.newHashMap();
        resourceMap.forEach((mainBody, inputStreamMap) -> {
            map.put(inputStreamMap.get(EXTENSIN_KEY), inputStreamMap.get(EXTENSIN_PROPERTIES));
        });
    } catch (Exception e) {
        return false;
    }


    // ... ...
    // 采用 map 进行后续特殊操作(省略)
    // ... ...
    return true;
}

部署到测试环境上,一探究竟。

java.io.FileNotFoundException: URL [jar:file:/app/yyxjService/lib/yyxj_service-0.0.1-SNAPSHOT.jar!/BOOT-INF/classes!/cool/zs/cert_zs.key] cannot be resolved to absolute file path because it does not reside in the file system: jar:file:/app/yyxjService/lib/yyxj_service-0.0.1-SNAPSHOT.jar!/BOOT-INF/classes!/cool/zs/cert_zs.key

分析原因 resource.getFile().getPath().split("/") ,Spring 没办法通过 File 的形式访问 jar 包里面的文件。

还能怎么实现?Spring 提供的 Resource 提供了 getURL 方法。

采用 resource.getURL().getPath().split("/") 改进代码如下。

private static final String EXTENSIN_KEY = "key";
private static final String EXTENSIN_PROPERTIES = "properties";


public static boolean initEnv() {
    try {
        Map<String, Map<String, InputStream>> resourceMap = Maps.newHashMap();


        // 1. 定义资源匹配规则,会在所有的JAR包的根目录下搜索指定文件
        String matchPattern = ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX + "/cool/*/*.*";
        // 2. 返回指定路径下所有的资源对象(子目录下的资源对象)
        ResourcePatternResolver resourcePatternResolver = new PathMatchingResourcePatternResolver();
        Resource[] resources = resourcePatternResolver.getResources(matchPattern);
        for (Resource resource : resources) {
            // 3. 获取文件名称
            String fileFlag = resource.getFilename().endsWith(EXTENSIN_KEY) ? EXTENSIN_KEY : EXTENSIN_PROPERTIES;
            // 4. 获取子目录名称
            String[] filePathAry = resource.getURL().getPath().split("/");
            String mb = filePathAry[filePathAry.length - 2];
            Map<String, InputStream> mbMap = resourceMap.get(mb);
            if (MapUtils.isEmpty(mbMap)) {
                mbMap = Maps.newHashMap();
                resourceMap.put(mb, mbMap);
            }
            mbMap.put(fileFlag, resource.getInputStream());
        }
        // 5. 封装资源文件流的Map
        Map<InputStream, InputStream> map = Maps.newHashMap();
        resourceMap.forEach((mainBody, inputStreamMap) -> {
            map.put(inputStreamMap.get(EXTENSIN_KEY), inputStreamMap.get(EXTENSIN_PROPERTIES));
        });
    } catch (Exception e) {
        return false;
    }


    // ... ...
    // 采用 map 进行后续特殊操作(省略)
    // ... ...
    return true;
}

测试环境部署后,跑起来贼爽,问题完美解决。

只见菜菜同学偷摸给自己竖起了大拇指,为自己点了个大大的赞。

因为菜菜心里最清楚,若后续有新的三方资源文件,只需把资源文件维护下就行了,代码已经实现了动态加载资源文件了,以后上线不用再动了,一劳永逸,so 酷。

3

 菜菜侃大山 

1、如何获取 SpringBoot jar 包中的指定文件夹下的资源文件子目录?

菜菜曰:借助 Spring 提供的 PathMatchingResourcePatternResolver 类得以解决。

2、获取文件路径时 resource.getFile().getPath() 为啥出现 FileNotFoundException?

菜菜曰:SpringBoot 没办法通过 File 的形式访问 jar 包里面的文件,借助 resource.getURL().getPath() 获取当前资源对应的URL的路径得以解决。

3、若已知道要加载的资源文件的名称与目录,该怎么加载呢?

菜菜曰:Xxx.getClass().getResourceAsStream("") 轻松解决。

程序员就是在解决问题中,能力得以不断提升,所以不要放过任何一个可以让自己成长的机会。久经码场,能静下来写 Bug、找 Bug 真是一件非常幸福的事情。

一起聊技术、谈业务、喷架构,少走弯路,不踩大坑。会持续输出精彩分享,敬请期待!

5cf4fedeee5a7545eed7d257fe87928a.png

历史推文(欢迎转发&点赞&在看):

这些技术轮子,让监控落地成为现实!

抓包神器 Wireshark,帮你快速定位线上网络故障(1)

抓包神器 Wireshark,帮你快速定位线上网络故障(2)

抓包神器 Wireshark,帮你快速定位线上网络故障(3)

抓包神器 Wireshark,帮你快速定位线上网络故障(4)

抓包神器 Wireshark,帮你快速定位线上网络故障(5)

抓包神器 Wireshark,帮你快速定位线上网络故障(6)

真实|技术人员该如何接手一个复杂的系统?吐血推荐这几招

JAVA Spring Boot 获取 Jar包内文件 File 获取jar包内文件File。 阅读详情

相关推荐

SpringBoot项目中读取resource目录下的文件(六种方法)

查找资源,所以如果不加“/”表示去根路径查找的话,是找不到的。源码里还是方法三、方法四,只不过做了一些封装,更方便开发。的getResource()是从。的getResource()是。查找的,所以不加“/”也可以。2)启动jar包指令。

m0_74823131的博客 2806

2018-12-19-java-jar包中的文件读取不到

这次项目中有一个配置文件,user.properties,用来配置一些用户账号等信息。放在src/main/resources下, 在项目中跑的好好的,打包后就读不到了。 我原来是使用 Xxx.class.getClassLoader().getResource(&quot;user.properties&quot;) 结果发现找不到文件,打印之,发现路径中多了一个!号。 xxx.jar!/user.pro...

小肥的胖 4240

Spring Boot项目打包上传到私服,出现依赖找不到[BOOT-INF]问题

最近在项目中配置了maven plugin,然后depoly到远端仓库之后发现,依赖这个Jar包的项目不能获取到被依赖包中的类,为什么会出现这种情况呢?其实很简单,如果将maven的插件放到工程中进行打包,它会将这个工程所依赖的Jar都打到这个包中,并放到BOOT-INF文件夹下面,这种方式打包的目的是为了让工程作为独立运行的程序部署到服务器上,而并非是给其他包提供依赖用的,如果你是想让它只是作为...

专注基础架构领域 3614

解决项目打成jar包上线无法读取配置文件(可通过挂载的方式解决)

注意事项:需要在主机上分层文件夹:在放jar包的目录下再新建一个resoures放配置文件,启动命令:nohup java -jar -Xbootclasspath/a:/root/xxxx/resources sms-0.0.1-SNAPSHOT.jar &背景介绍:因为项目上线部署要打成jar包,jar包相当于一个大文件夹,无目录分层,自然就没法读到resources下的文件,于是我找了很多springboot-项目获取resources下文件的方法都没能解决。

qq_45472669的博客 2886

Linux中Hadoop 集群搭建

零、下载Hadoop: http://archive.cloudera.com/cdh5/cdh/5/?tdsourcetag=s_pctim_aiomsg 一、集群规划: 搭建的 hadoop 集群由 3 台服务器组成,分别叫做 master,salve1 和 slave2。其中 master 作为主节点,slave1 和 slave2 作为从节点。 二、网络配置: 1.查看 3 个节点的主机名...

白墨的小白博客 3992

SAP MTS计划策略40实战:如何配置‘带最终组装的计划‘提升定制化生产效率

本文深入解析SAP计划策略40(带最终组装的计划)的核心机制与实战配置。该策略通过“需求消耗”与“组装灵活性”,有效融合按库存生产(MTS)与按订单生产(MTO)的优势,帮助制造企业在保持通用组件库存稳定的同时,快速响应客户的定制化需求,从而提升生产效率与客户满意度。

ruby5的博客 967

springboot读取文件,打成jar包后访问不到

最新开发出现一种情况,springboot打成jar包后读取不到文件,原因是打包之后,文件的虚拟路径是无效的,只能通过流去读取。 文件在resources下 public void test() { List&lt;String&gt; names = new ArrayList&lt;&gt;(); InputStreamReader read = null; try { ...

WoddenFish的博客 2553

TJA1445/TJA1465 CAN收发器硬件设计与软件配置实战指南

控制器局域网(CAN)总线是汽车电子和工业控制领域实现电子控制单元(ECU)间可靠通信的核心技术。其工作原理是将数字信号转换为差分信号进行抗干扰传输,技术价值在于构建稳定、高效的分布式实时控制系统。随着汽车电子架构向域集中式演进,对CAN总线的通信速率、网络复杂度和静态功耗提出了更高要求,这催生了支持CAN FD协议和智能电源管理的新一代高速CAN收发器。在车载网关、域控制器及工业网络节点等应用场景中,NXP的TJA1445和TJA1465系列收发器凭借其部分组网(Partial Networking)和选

weixin_29655587的博客 409

springboot 打 jar 包后读取不到文件

jar:file:/D:/test/test/.metadata/.plugins/org.eclipse.wst.server.core/test/test/test/WEB-INF/lib/test-0.0.1-SNAPSHOT.jar!/ca.crt 在你的项目中可能经常会使用 ClassLoader.getSystemResourceAsStream 等方法来读取一个文件内容,使用 properties 来读取。 但是当你打包后会发现你程序出现了问题,这个时候怎么办呢? ** 解决 ** 可以尝试

2870

MemSeg:一种差异和共性来检测图像表面缺陷的半监督方法

本文认为人为创建类内差异和保持类内共性可以帮助模型实现更好的缺陷检测能力,从而更好地区分非正常图像。如图一所示。差异(differences):MemSeg引入人工模拟的异常图像在训练阶段使模型能够区分正常和异常的图像,减轻了半监督学习只能用正常样本进行训练的不足,然后在推理阶段可以直接输入图像无需做任何后处理。共性(commonalities):MemSeg引入了一个记忆池来记录正常样本的通用模式,在训练和推理阶段,比较输入图像和记忆池中的样本之间的差异,为异常区域的定位提供有用的信息。

斯人若彩虹,遇上方知有! 4841

进阶篇第8节:寄存器压力——寄存器溢出对性能的影响及优化

**摘要:GPU寄存器是最快的存储单元(1周期访问),但数量有限。过高的寄存器使用会导致溢出(变量存入慢速本地内存)或降低占用率(减少并发线程数),严重影响性能。优化方法包括复用变量、使用共享内存替代寄存器数组、限制寄存器数量(--maxrregcount)等。实际测试显示,将寄存器使用从48个降至24个可使性能提升37%。分析工具如Nsight Compute可帮助检测寄存器压力。面试常见问题涉及寄存器溢出的检测与优化策略。

PeterPan的博客 95

ClassLoader读取文件,springboot打jar包后读取不到

jar:file:/D:/test/test/.metadata/.plugins/org.eclipse.wst.server.core/test/test/test/WEB-INF/lib/test-0.0.1-SNAPSHOT.jar!/ca.crt 在你的项目中可能经常会使用ClassLoader.getSystemResourceAsStream等方法来读取一个文件内容,使用properties来读取。 但是当你打包后会发现你程序出现了问题,这个时候怎么办呢? **解决**可以尝试一下以下的代码

1176

爬虫:一文掌握网站加密和混淆以及浏览器调试的技巧

面对加密和混淆技术的网站,传统的爬虫方法可能难以奏效。通过结合浏览器调试工具(如Puppeteer、Playwright)、代理工具(如Burp Suite、Fiddler)以及动态和静态分析技巧,可以深入理解网站的运行机制,绕过加密和混淆,实现有效的数据抓取。同时,务必注意合法合规,尊重目标网站的规则和用户的隐私,确保爬虫行为的正当性和可持续性。

数据知道的博客 9891

springboot在打成jar包后读取不到配置文件

前几天一个项目,需要用到fastdfs来处理文件,但是找了半天没找到写在properties文件里的方法,就打算直接用fastdfs现成的配置文件 起了个名字,丢进resources下面,看起来一切正常,本地跑也完全没有问题: 然后jenkins编译打包,放到线上,跑了一下,发现jenkins跑不过?报错,文件未找到! 上网查资料,告知是因为达成jar包之后,文件路径获取不到,拿不到指定文件也是正常的,接下来就是找解决方案的时候,网上大多是使用文件流的方式,但是我使用这种方式还是拿不到,希望有大佬可以告

weixin_44240612的博客 3144

Tableau学习教程(万字保姆级教程)​​​​​​

​Tableau学习教程(保姆级教材,学不会私信留言来找我) 从BI系统开发的角度来学习tableau工具,更学会报表开发的流程 内含学习使用数据源,tableau打包工作簿,可直接提取使用 ​...

小菜菜的博客 6万+

RK3568/RK3588 + YT 9215交换机芯片,MAC TO MAC 调试记录

原来的方案是rk3568 gmac 直接接phy,phy 接 switch 芯片,只是把交换芯片当交换用,驱动方面基本不用开发,但是要做vlan 那么必须涉及交换芯片的开发。选择裕太微有两个方面的原因:1.国产化替代2.可获得原厂技术支持3.目前已经完成 两个gmac 口交换芯片的配置,实现vlan,内部交换,两个光口可正常通信。

Nyiragongo的博客 1万+

springboot读取文件,打成jar包后访问不到的解决

原文链接:https://www.jb51.net/article/216612.htm springboot读取文件,打成jar包后访问不到 最新开发出现一种情况,springboot打成jar包后读取不到文件,原因是打包之后,文件的虚拟路径是无效的,只能通过流去读取。 文件在resources下 public void test() { List<String> names = new ArrayList<>(); InputStreamReader read = nul

pscool的博客 4275

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

springboot打jar包读取不到resources下的.txt文件

springboot 在本地调试,可以读取到resources下的文件内容,但是打jar包之后,找不到文件 原因:在本地调试,文件存在于本地磁盘,通过获取文件路径可以正常读取. 打成jar包部署在Linux环境之后,没有真实的磁盘路径this.class.getResource("")方法,ResourceUtils.getFile()方法无法正确获取文件. 解决办法: jar内部的东西可以当...

a513684882的博客 1379

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

springboot 项目打成 jar 包后找不到 ResourceUtils.getFile 读取的文件

springboot 项目打成 jar 包后,找不到 ResourceUtils.getFile 读取的文件。使用 ResourceUtils.getFile 读取的文件为空 解决办法: 不使用 ResourceUtils.getFile 方法,改用 ClassPathResource 读取,具体代码如下 ClassPathResource classPathResource = new Cla...

悟世君子的博客 4001

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

spring boot项目启动时读取静态资源文件,但打包jar包后获取不到路径

spring boot项目启动时读取静态资源文件,但打包jar包后获取不到路径 实现项目启动时调用某方法 实现ApplicationRunner接口、实现CommandLineRunner接口,注意搭配 @Component 注解使用 package com.pantech.cloudmessagehandler.provider; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.al

Yu_Mariam的博客 1250

springBoot 框架打成jar包,读取不到webapp下的静态文件

问题:使用springboot写一个微服务,将pdf以模板形式导出,pdf模板放在webapp下,在eclipse中运行没有问题;以maven打成jar包,导出pdf时,提示找不到该模板; 打开jar包,其中没有静态文件 解决思路:将该模板放在resource文件根下,将读取方式换做类加载器流读取 // 文件根路径 InputStream fileRootPath = ...

Mr.ZD的专栏 7034

SpringBoot构建成jar包,读取不到resources目录下文件问题

至此,导出功能正常。

chuxuan0215的博客 571

Springboot项目打成jar包或war包后,项目Resource下文件读取不到

这是在项目中需要调用其他项目的接口,其他项目需要证书才能访问,这个问题是在获取证书的时候遇到的。 假设证书文件位于项目的位置是:resources/config/tls/zhengshu.p12 通过以下代码获取证书位置,既可以使项目代码在idea下运行时获取到证书位置,也可以把项目打成jar或war包后运行代码也能获取到证书的位置。 try { ClassPathResource classPathResource = new ClassPathResource("config/tls/zhengsh

Horsleyli的博客 1365

SpringBoot 打jar包部署读取不到Resources 下文件解决

所要读取的文件所处项目路径: 原先代码: String templateUrl = ResourceUtils.getURL(reportTemplate).getPath(); InputStream is = new FileInputStream(new File(templateUrl)); 2.修改成打jar包方式: // 方法一 InputStream is = this.getClass().getClassLoader().getResourceAsStream(reportTem

u014212540的博客 1173

springboot打jar包,部署linux,resource文件夹下的文件读取不到

就这一个小问题,困扰了我24H......可能还有更优解,欢迎讨论以下3种方法均可以在windows10上正常使用,可以根据自己爱好,任选其一。1、“src/main/resources/fonts/STSONG.TTF

wzhwangzhuohui的博客 803

java spring 打包后找不到路径,SpringBoot打成jar包后无法读取resources资源文件里文件路径的问题cannotberesolvedtoabsolutefi...

在项目中做了一个支付功能, 需要引入第三方渠道的配置文件config.xml用来初始化文件证书, 将配置文件config.xml 放到 resources 资源目录下。本地开发环境下能正常读取该文件, 但是在 Linux 环境下将项目打包成jar后运行会出现如下异常:java.io.FileNotFoundException: class path resource [static/config....

weixin_31056947的博客 2443
上一篇: URL中一个“+”号引发的投诉
下一篇: 2021 苟且活着,2022 向上生长
一猿小讲
博客等级 码龄15年 294粉丝 156原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值