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

 更新时间:2023年12月26日 15:03:11   作者:Stephen·You  
今天在项目中遇到一个业务场景,需要用到resources资源目录下的文件,本文主要介绍了Springboot获取jar包中resources资源目录下的文件,感兴趣的可以了解一下

阿萨斯多问题现象:

今天在项目中遇到一个业务场景,需要用到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();
		}

到此这篇关于Springboot获取jar包中resources资源目录下的文件的文章就介绍到这了,更多相关Springboot获取resources文件内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家! 

相关文章

  • HttpClient实现调用外部项目接口工具类的示例

    HttpClient实现调用外部项目接口工具类的示例

    下面小编就为大家带来一篇HttpClient实现调用外部项目接口工具类的示例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-10-10
  • Java文件读写详解

    Java文件读写详解

    在真实的应用场景中,很多时候需要使用 Java 读写文件。比如说,读取配置文件信息、读取用户输入等。本篇文章将会详细介绍 Java 文件读写的相关知识,其中包括:读取文件、写入文件、复制文件和删除文件等操作,需要的朋友可以参考下
    2023-05-05
  • RedisTemplate和Redisson的区别

    RedisTemplate和Redisson的区别

    本文主要介绍了RedisTemplate和Redisson的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-11-11
  • Mybatis 一级缓存与二级缓存的实现

    Mybatis 一级缓存与二级缓存的实现

    mybatis作为一个流行的持久化工具,缓存必然是缺少不了的组件。通过这篇文章,就让我们来了解一下一级缓存与二级缓存的实现,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-05-05
  • Spring Cloud Alibaba使用Sentinel实现接口限流

    Spring Cloud Alibaba使用Sentinel实现接口限流

    这篇文章主要介绍了Spring Cloud Alibaba使用Sentinel实现接口限流,本文详细的介绍了Sentinel组件的用法以及接口限流,感兴趣的可以了解一下
    2019-04-04
  • IDEA全局查找关键字的用法解读

    IDEA全局查找关键字的用法解读

    这篇文章主要介绍了IDEA全局查找关键字的用法解读,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02
  • Java中long类型与Long类型的区别和大小比较详解

    Java中long类型与Long类型的区别和大小比较详解

    这篇文章主要给大家介绍了Java中long类型与Long类型区别和大小比较的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2017-11-11
  • Java中List类的contains和indexOf方法的使用及区别

    Java中List类的contains和indexOf方法的使用及区别

    这篇文章主要介绍了Java中List类的contains和indexOf方法的使用及区别,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2026-03-03
  • Java如何基于反射机制获取不同的类

    Java如何基于反射机制获取不同的类

    这篇文章主要介绍了Java如何基于反射机制获取不同的类,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-08-08
  • mybatis plus generator 根据数据库自动生成实体类的实现示例

    mybatis plus generator 根据数据库自动生成实体类的实现示例

    本文主要介绍了mybatis plus generator 根据数据库自动生成实体类的实现示例,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-09-09

最新评论