如何获取jar包resources文件路径

 更新时间:2023年12月26日 15:12:09   作者:GJQ-JAVA  
java项目发布到jar之后找不到文件路径,遇到这样问题如何处理呢,下面小编给大家分享获取jar包resources文件路径的解决方法,感兴趣的朋友一起看看吧

获取jar包resources文件路径

java项目发布到jar之后找不到文件路径
本地: String path = this.getClass().getClassLoader().getResource(xmlPath).getPath();
打成jar发布服务器不管用了

解决办法:

//相对路径
 private final String xmlPath= "/jenkinspipeline/PipelineConfig.xml";
    public StringBuilder propertyResolverXml(String xmlPath) {
        InputStream resourceAsStream = XmlLocalUtils.class.getResourceAsStream(xmlPath);//读取内容
        StringBuilder xmlStr = new StringBuilder();
        BufferedReader read = null;
        try {
            read = new BufferedReader(new InputStreamReader(resourceAsStream));//转成bufferreader按行读取
            String tempStr;
            while ((tempStr = read.readLine()) != null) {
                xmlStr.append(tempStr);
            }
            read.close();
        } catch (Exception ex) {
            log.error("解析文件异常:", ex);
            throw new NativeSphereCicdException(NativeSphereCicdEnum.PROPERTYRESOLVERXML_EXCEPTION);
        }
        return xmlStr;
    }

补充:

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文件内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java实现单例模式的五种方法介绍

    Java实现单例模式的五种方法介绍

    单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例。在计算机系统中,线程池、缓存、日志对象、对话框、打印机、显卡的驱动程序对象常被设计成单例
    2023-01-01
  • Java集合List的使用详细解析

    Java集合List的使用详细解析

    这篇文章主要介绍了Java集合List的使用详细解析,List集合类中元素有序、且可重复,集合中的每个元素都有其对应的顺序索引,鉴于Java中数组用来存储数据的局限性,我们通常使用java.util.List替代数组,需要的朋友可以参考下
    2023-11-11
  • java/word+fusionchart生成图表深入分析

    java/word+fusionchart生成图表深入分析

    本文将以java/word+fusionchart生成图表问题深入解析,有兴趣的朋友可以参考下
    2012-11-11
  • Java对接微信支付全过程

    Java对接微信支付全过程

    本文主要介绍了Java对接微信支付全过程,涵盖注册商户、生成预支付订单、处理回调和查询订单状态等,具有一定的参考价值,感兴趣的可以了解一下
    2025-03-03
  • 关于aop切面 注解、参数如何获取

    关于aop切面 注解、参数如何获取

    这篇文章主要介绍了关于aop切面 注解、参数如何获取,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教。
    2022-01-01
  • Spring Boot 整合 MyBatis 连接数据库及常见问题

    Spring Boot 整合 MyBatis 连接数据库及常见问题

    MyBatis 是一个优秀的持久层框架,支持定制化 SQL、存储过程以及高级映射,下面详细介绍如何在 Spring Boot 项目中整合 MyBatis 并连接数据库,感兴趣的朋友一起看看吧
    2025-03-03
  • 解析Java和Eclipse中加载本地库(.dll文件)的详细说明

    解析Java和Eclipse中加载本地库(.dll文件)的详细说明

    本篇文章是对Java和Eclipse中加载本地库(.dll文件)进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • 如何在mybatis中向BLOB字段批量插入数据

    如何在mybatis中向BLOB字段批量插入数据

    这篇文章主要介绍了如何在mybatis中向BLOB字段批量插入数据的相关知识,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2020-10-10
  • 详解java中String、StringBuilder、StringBuffer的区别

    详解java中String、StringBuilder、StringBuffer的区别

    这篇文章主要介绍了java中String、StringBuilder、StringBuffer的区别,文中讲解的很清晰,有对于这方面不太懂的同学可以研究下
    2021-02-02
  • Java实现修改图片文件名的方法示例

    Java实现修改图片文件名的方法示例

    在很多应用中,用户需要对文件进行重命名操作,包括图片文件,图片文件的重命名操作可以是基于文件内容、日期、用户输入等,本项目的目标是实现一个Java程序,能够修改图片文件的文件名,并进行简单的文件名处理,需要的朋友可以参考下
    2025-02-02

最新评论