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

相关文章

  • 关于ObjectUtils.isEmpty() 和 null 的区别

    关于ObjectUtils.isEmpty() 和 null 的区别

    这篇文章主要介绍了关于ObjectUtils.isEmpty() 和 null 的区别,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-02-02
  • Java的接口调用时的权限验证功能的实现

    Java的接口调用时的权限验证功能的实现

    这篇文章主要介绍了Java的接口调用时的权限验证功能的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11
  • Spring AOP实现声明式事务机制源码解析

    Spring AOP实现声明式事务机制源码解析

    这篇文章主要为大家介绍了Spring AOP实现声明式事务机制源码解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-12-12
  • 在java代码中获取JVM参数的方法

    在java代码中获取JVM参数的方法

    下面小编就为大家带来一篇在java代码中获取JVM参数的方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-01-01
  • IDEA自定义Maven仓库的实现

    IDEA自定义Maven仓库的实现

    使用Maven进行Java程序开发时,开发者能够极大地提高开发效率,本文主要介绍了IDEA自定义Maven仓库的实现,具有一定的参考价值,感兴趣的可以了解一下
    2024-03-03
  • Spring Boot使用线程池处理上万条数据插入功能

    Spring Boot使用线程池处理上万条数据插入功能

    这篇文章主要介绍了Spring Boot使用线程池处理上万条数据插入功能,使用步骤是先创建一个线程池的配置,让Spring Boot加载,用来定义如何创建一个ThreadPoolTaskExecutor,本文通过实例代码给大家介绍的非常详细,需要的朋友参考下吧
    2022-08-08
  • JDK动态代理提高代码可维护性和复用性利器

    JDK动态代理提高代码可维护性和复用性利器

    这篇文章主要为大家介绍了JDK动态代理提高代码可维护性和复用性利器,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-10-10
  • Spring 多数据源方法级别注解实现过程

    Spring 多数据源方法级别注解实现过程

    多数据源管理是Spring框架中非常重要的一部分,它可以提高应用程序的灵活性和可靠性,从而更好地满足业务需求,这篇文章主要介绍了Spring 多数据源方法级别注解实现,需要的朋友可以参考下
    2023-07-07
  • 详解Elasticsearch如何实现简单的脚本排序

    详解Elasticsearch如何实现简单的脚本排序

    Elasticsearch 是位于 Elastic Stack 核心的分布式搜索和分析引擎,可以为所有类型的数据提供近乎实时的搜索和分析。本文主要介绍了Elasticsearch如何实现简单的脚本排序,感兴趣的可以了解一下
    2023-01-01
  • 详解使用Maven构建多模块项目(图文)

    详解使用Maven构建多模块项目(图文)

    这篇文章主要介绍了详解使用Maven构建多模块项目(图文),非常具有实用价值,需要的朋友可以参考下
    2017-09-09

最新评论