Springboot获取jar包中resources资源目录下的文件

news/2024/10/21 7:38:39/

阿萨斯多问题现象:

        今天在项目中遇到一个业务场景,需要用到resources资源目录下的文件,然后就在思考一个问题:

        当项目打成jar后,Springboot要如何获取resources资源目录下的文件呢?


问题分析:

        如题,如何在项目打成jar包之后,在代码中依然能够获取到jar包中resources资源目录下的文件呢?

        我们都知道其实要获取resources资源目录下的文件,有非常多的方法;这些方法虽然能在正常的debug本地运行项目时有效,但在项目打成jar包运行时,却并非都是有效的了!!!

        因此,在这里我打算记录一个亲测可行的方法。

        首先,展示一下我的项目结构,如图我在resources资源目录下创建了一个文件夹rules,然后在其中创建了3个drl文件:

        由于代码逻辑非常简单,所以这里直接通过启动类来测试了。

        ResourceDemoApplication:

import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.core.io.support.ResourcePatternResolver;import java.io.File;
import java.io.IOException;/*** resource资源目录专题* @author Stephen*/
@SpringBootApplication
public class ResourceDemoApplication {public static void main(String[] args) {
//		SpringApplication.run(ResourceDemoApplication.class, args);try {//如何获取resource下的文件?【注意:即使打成jar包也得有效】ResourcePatternResolver resourcePatternResolver = new PathMatchingResourcePatternResolver();Resource[] resources = resourcePatternResolver.getResources("classpath*:rules/**/*.*");for ( Resource resource : resources ) {//获取文件名System.out.println(resource.getFilename());//获取文件,该方式在打成jar包后会报错,因为resource文件不在系统中,而是在jar包中File file1 = resource.getFile();//获取文件,在打成jar包后,通过url来获取文件,则路径是正确的File file = new File(resource.getURL().getFile());//获取文件绝对路径,但路径有问题,因为resource文件不在系统中,而是在jar包中
//				System.out.println(file.getAbsolutePath());//获取文件名System.out.println(file.getName());}} catch (IOException e) {e.printStackTrace();}}}

        接下来展示的是运行结果。

        首先是本地项目:        

        可以看到,非常顺利的打印出了文件名。

        然后是jar包运行:

        同样没问题。


注意:

        需要注意的是:在 ResourceDemoApplication 启动类中,有两行被注释掉的代码:

        上面这行代码在本地运行是没问题的,但打成jar包运行时会出现如下报错,所以不建议使用:

        显示的文件路径是:

jar:file:/C:/Users/Administrator/Desktop/resource_demo-0.0.1-SNAPSHOT.jar!/BOOT-INF/classes!/rules/comparison-rules.drl

        可以看到 resource_demo-0.0.1-SNAPSHOT.jar 后面跟了一个 ! 然后才是对应drl文件target包中的路径,这个细节我没有深究,但单从这个暴多的文件路径来分析的话,我的理解就是,这个文件路径其实是个伪路径,它不是文件真实的url地址,所以通过resource对象无法获取到文件。

        

        另一行注释的代码是:

         执行这行代码,即使在jar包运行时,也不会报错,只是在jar包运行时,打印的文件绝对路径并不是真实的路径,也就是系统无法识别,因为这个文件在jar包内部,路径如下:

         如有扩展,后续将会补充。


解决方法:

		try {ResourcePatternResolver resourcePatternResolver = new PathMatchingResourcePatternResolver();Resource[] resources = resourcePatternResolver.getResources("classpath*:rules/**/*.*");for ( Resource resource : resources ) {//获取文件,在打成jar包后,通过url来获取文件,则路径是正确的File file = new File(resource.getURL().getFile());}} catch (IOException e) {e.printStackTrace();}


http://www.ppmy.cn/news/53822.html

相关文章

【前端基础知识】Vue中的变量不是响应式的吗?属性赋值后视图不变化的原因是什么?

目录 🤔问题📝回答🎨使用场景动态添加属性动态添加数组元素 ❌注意事项$set只能在响应式对象上使用$set不能用于根级别的属性$set的性能问题 📄总结 🤔问题 Vue是一款在国内非常流行的框架,采用MVVM架构&a…

ChatGPT原理剖析

文章目录 ChatGPT常见误解1. 罐头回应2. 网络搜寻重组 ChatGPT真正做的事——文字接龙ChatGPT背后的关键技术——预训练(Pre-train)一般机器是怎样学习的? ChatGPT带来的研究问题1. 如何精准提出需求2. 如何更改错误3. 侦测AI生成的物件4. 不…

如何优雅的写个try catch的方式!

软件开发过程中,不可避免的是需要处理各种异常,就我自己来说,至少有一半以上的时间都是在处理各种异常情况,所以代码中就会出现大量的try {...} catch {...} finally {...} 代码块,不仅有大量的冗余代码,而…

Leetcode——485. 最大连续 1 的个数

💯💯欢迎来到的热爱编程的小K的Leetcode的刷题专栏 文章目录 1、题目2、滑动窗口3、一次遍历(官方题解) 1、题目 题目:给定一个二进制数组 nums , 计算其中最大连续 1 的个数。 示例 1: 输入:nums [1,1,0…

python基础实战4-python基础语法

1、注释(Comments) 注释用来向用户提示或解释某些代码的作用和功能,它可以出现在代码中的任何位置。 Python解释器在执行代码时会忽略注释,不做任何处理,就好像它不存在一样。 1.1 代码注释介绍 注释就是对代码的解…

【浓缩概率】浓缩概率思想帮我蒙选择题的概率大大提升!

今天在学习的时候遇到一个很有趣的思想叫作浓缩概率,可以帮我们快速解决一下概率悖论问题! 什么是概率 计算概率有下面两个最简单的原则: 原则一、计算概率一定要有一个参照系,称作「样本空间」,即随机事件可能出现…

OpenCV实战5 车牌号识别

原文在这里,参考这个进行了改进 感觉学到了很多东西,便在这里作下笔记。 效果: 目录 一、知识点学习: 1. fstream 2. 形态学开操作与形态闭操作 2.1 第一个角度:消除较小的联通区域 vs 弥合较小的联通区域 2.2 第二个角度&…

自动驾驶技术的优势、局限性及未来发展趋势

自动驾驶技术是当前汽车行业的热门话题之一。该技术的发展,不仅可以提高车辆的安全性和行驶效率,还可以为人们的出行带来更多便利。但与此同时,自动驾驶技术也存在着许多争议和挑战。接下来从以下四个方面谈一下我对自动驾驶技术的看法。 一…