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

news2024/9/22 3:44:18

阿萨斯多问题现象:

        今天在项目中遇到一个业务场景,需要用到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.coloradmin.cn/o/459110.html

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

相关文章

基于GPT-3和DALL-E的原创漫画生成

我花了上个月的时间探索如何使用 OpenAI 的 GPT-3 文本生成器和他们的 DALL-E 图像到文本系统来创建新的漫画,而无需编写任何源代码。 请注意,这两个系统都处于测试阶段,在我用完所有免费代币后,它们开始收取象征性的使用费。 不过…

数据湖Iceberg-简介(1)

文章目录 Iceberg简介概述特性数据存储、计算引擎插件化实时流批一体数据表演化(Table Evolution)模式演化(Schema Evolution)分区演化(Partition Evolution)列顺序演化(Sort Order Evolution&a…

Inpaint9.1最新网页版下载及inpaint怎么去水印教程

市面上去水印的软件很多,但专业去除水印的,除了Photoshop,inpaint占有一席之地。在今天的数字时代,我们经常会遇到需要处理图片的情况。然而,当我们遇到水印在图片上,我们就需要寻找一个有效的方式来去除它…

总结831

学习目标: 4月(复习完高数18讲内容,背诵21篇短文,熟词僻义300词基础词) 学习内容: 暴力英语:背诵《start with you》,《大独裁者》第四段,默写《start with you》 高等数学&#x…

信号量【Linux】

文章目录 1. POSIX信号量1.1 引入1.2 概念1.3 PV原语(原理)1.4 相关接口 2. 二进制信号量3. 基于环形队列的生产消费模式3.1 介绍3.2 为什么要使用环形队列3.3 环形队列的作用3.4 实现互斥和同步两个信号量框架生产和消费的逻辑完善环形队列1信号量完善环…

MyBatis-学习修改尚硅谷最新教程笔记

一、MyBatis mybatis mybatis.xml配置文件 mapper接口类 mapper.xml映射处理配置文件 1、MyBatis简介 1.1、MyBatis历史 MyBatis最初是Apache的一个开源项目iBatis, 2010年6月这个项目由Apache Software Foundation迁移到了Google Code。随着开发团队转投Google Code旗下…

【图像抠图】【深度学习】Ubuntu18.04下GFM官方代码Pytorch实现

【图像抠图】【深度学习】Ubuntu18.04下GFM官方代码Pytorch实现 提示:最近开始在【图像抠图】方面进行研究,记录相关知识点,分享学习中遇到的问题已经解决的方法。 文章目录 【图像抠图】【深度学习】Ubuntu18.04下GFM官方代码Pytorch实现前言数据集说明1.AM-2k【自然动物】2.B…

银行数字化转型导师坚鹏:学习贯彻二十大精神 解码乡村振兴之道

学习贯彻二十大精神 解码乡村振兴之道(保险客户) 课程背景: 很多保险公司从业人员存在以下问题: 不知道如何准确解读二十大精神? 不清楚乡村振兴相关政策要求? 不知道如何有效推动乡村振兴&#xf…

【JavaEE初阶】多线程(三)volatile wait notify关键字 单例模式

摄影分享~~ 文章目录 volatile关键字volatile能保证内存可见性 wait和notifywaitnotifynotifyAllwait和sleep的区别小练习 多线程案例单例模式饿汉模式懒汉模式 volatile关键字 volatile能保证内存可见性 import java.util.Scanner;class MyCounter {public int flag 0; }p…

2023新型智慧城市解决方案(ppt可编辑)

本资料来源公开网络,仅供个人学习,请勿商用,如有侵权请联系删除 智慧城市建设整体框架 智慧城市建设内容 智慧城市云基础架构的必要性 智慧城市建设效益 智慧城市建设效益17 智慧城市建设模式建议 智慧城市建设-整体解决法方案 智慧城市建设…

关于Nginx

一、常见的“服务器中间件”(即http server-web中间件)有哪些 Tomcat、Jboss、Apache、WeBlogic、Jetty、webSphere、Nginx、IIS 二、nginx的特点 1.性能高,能承受5万并发每秒; 2.内存、磁盘,读取消耗空间小。 三、…

「背包问题-步入」失衡天平

失衡天平 https://ac.nowcoder.com/acm/contest/24213/1021 题目描述 终于Alice走出了大魔王的陷阱,可是现在傻傻的她忘了带武器了,这可如何是好???这个时候,一个神秘老人走到她面前答应无偿给她武器,但老人有个条件&#xff…

2023-04-24 算法面试中常见的贪心算法问题

贪心算法 1 贪心选择例题 455.饼干分配 假设你想给小朋友们饼干。每个小朋友最多能够给一块儿饼干。每个小朋友都有一个“贪心指数”,称为g(i),g(i)表示的是这名小朋友需要的饼干大小的最小值。同时,每个饼干都有一个大小值s(i)。如果s(j)…

转换json格式的日期为Javascript对象的函数

项目中碰到了用jQuery从后台获取的json格式的日期的字符串,需要将此字符串转换成JavaScript的日期对象。 代码如下: //转换json格式的日期(如:{ServerDatetime:"\/Date(1278930470649)\/"})为Javascript的日期对象 fu…

【离散系统】传递函数和状态空间方程离散化

本文如有错误,恳请指正。 目录 离散系统 采样控制系统 数字控制系统 信号采样 采样定理(香农定理) 信号保持—零阶保持器 Z变换 Z 变换方法 级数求和法 部分分式法 基本定理 Z反变换 Z反变换方法 长除法 部分分式法&#xff0…

hook函数,toRef家族

自定义hook函数 什么是hook?——本质是一个函数,把setup函数中使用的组合式API 进行了封装。 类似于vue2.x中的mixin。 自定义hook的优势:复用代码,让setup中的逻辑更清楚易懂。 定义钩子: 使用钩子 toRef,toRefs 作用:创建一个ref对象…

WinScope实现录制视频与是Timeline时间轴同步设置方法-千里马framework车载手机系统开发实战

hi,粉丝朋友们! 背景: 今天来分享一个粉丝朋友提出的问题,那就是他在学习wms课程时候有用到winscope工具,提出一个疑问,就是google官网说的有录屏可以结合起来一起看。具体如下: 其实这个以…

Vue 手搓轮播效果

tiptop: 为啥需要写这个功能,因为我遇到了每个轮播层内要放3个左右的商品块,如果使用element自带的轮播就需要将一维数组切成二维数组,导致处理一些情况下就会变得很麻烦,当然那种我也写了如果你们有需要,在下方留言我…

柳永8首绝美词句

他是白衣卿相,是才子词人。 他有傲人的才华,却仕途失意。 他眠花宿柳,写下流传千古的词章。 他是才子柳永。 今天,给大家介绍他的8首词,体会柳永的人生起伏。 1、《雨霖铃 寒蝉凄切》 寒蝉凄切,对长亭晚…

Kafka 安装部署-单节点

Kafka强依赖ZK,如果想要使用Kafka,就必须安装ZK,Kafka中的消费偏置信息、kafka集群、topic信息会被存储在ZK中。有人可能会说我在使用Kafka的时候就没有安装ZK,那是因为Kafka内置了一个ZK,一般我们不使用它。 部署说明…