idea启动与jar包启动中使用resource资源文件路径的问题

 更新时间:2023年07月17日 09:16:28   作者:某猿蚊常叮  
这篇文章主要介绍了idea启动与jar包启动中使用resource资源文件路径的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

idea启动与jar包启动中使用resource资源文件路径

问题描述

项目直接用idea运行的时候好好的,但是打包成Jar之后却出现了莫名其妙的BUG,经过很长时间的调试之后,才发现是打包之后的文件路径出现了问题。

在原本的代码中使用的是这样的代码来读取resource中的文件

ClassLoader classLoader = this.class.getClassLoader();   
URL appUrl = classLoader.getResource("center/AppStarter.java"); 
File appJava = new File(appUrl.getFile());

这样的代码直接运行时没问题的,能够正确的读取到文件,但是打包成jar之后,

在网上查找了很久,终于找到了解决方法。

读取resource中的文件需要使用InputStream来进行读取,然后转换成String。

具体实现可以参看下面的代码。

//2.创建输入流
String path = "META-INF/item.xml"
InputStream is = this.getClass().getClassLoader().getResourceAsStream(path);

这样写了之后打包成jar后能够成功读取到resource中的文件

问题分析

在idea中可以通过绝对路径读取文件,但是package成jar包之后,路径的文件形式发生变化,但是可以通过class路径,然后通过相对路径的方式拿到文件流,达到文件内容的读取。

Jar包启动通过ClassPathResource获取不到文件路径

项目目录结构

在这里插入图片描述

maven项目resources目录也是会被编译到classpath下的。

      ClassPathResource resource = new ClassPathResource("/map/map.properties");
        InputStream inputStream = resource.getInputStream();
        System.out.println("inputStream.available() = " + inputStream.available());
        System.out.println("resource.getFile().getAbsolutePath() = " +    	resource.getFile().getAbsolutePath());

如果是使用idea进行本地开发时,是可以获取到classpath下的资源的路径的,因为是读取的磁盘上的真正的那个文件。

在这里插入图片描述

但是如果将项目打包成一个jar包后,再获取map.properties是获取不到的,对于操作系统来说最多只能读取到jar包,而不能再继续读取jar包里面的文件了,如果继续读取,只能交给jvm去读了,此时能读取到二进制流,而不能获取到路径。

可通过以下几种方式获取classpath下的资源

 ClassPathResource classPathResource = new ClassPathResource("/map/map.properties");
        InputStream cis = classPathResource.getInputStream();
        //获取classpath下第一个/map/map.properties,这个根据jar包的加载先后顺序有关
        InputStream ris = ClassPathResource.class.getClassLoader().getResourceAsStream("/map/map.properties");
        //这个是获取classpath下所有的map/map.properties,在jvm运行时,所有jar都相当于是一个classpath
        Enumeration<URL> resources = ClassPathResource.class.getClassLoader().getResources("/map/map.properties");

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 基于java的opencv开发过程详解

    基于java的opencv开发过程详解

    这篇文章主要介绍了基于java的opencv开发过程详解,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-04-04
  • Spring整合mybatis实现过程详解

    Spring整合mybatis实现过程详解

    这篇文章主要介绍了Spring整合mybatis实现过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-07-07
  • Java程序包不存在问题的解决办法

    Java程序包不存在问题的解决办法

    最近工作中遇到个问题,代码中没有报错,启动时报错,但是程序包不存在,这篇文章主要给大家介绍了关于Java程序包不存在问题的解决办法,需要的朋友可以参考下
    2022-06-06
  • java实现日历功能

    java实现日历功能

    这篇文章主要为大家详细介绍了java实现日历功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-06-06
  • Java中的对象和引用详解

    Java中的对象和引用详解

    这篇文章主要介绍了Java中的对象和引用详解的相关资料,需要的朋友可以参考下
    2017-05-05
  • java.lang.NumberFormatException异常解决方案详解

    java.lang.NumberFormatException异常解决方案详解

    这篇文章主要介绍了java.lang.NumberFormatException异常解决方案详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • SpringBoot中的健康检查详解

    SpringBoot中的健康检查详解

    这篇文章主要介绍了SpringBoot中的健康检查详解,健康检查是一种用来确保应用程序和其所依赖的服务的状态正常的机制,在本文中,我们将探讨SpringBoot中的健康检查是什么以及如何使用它来监视应用程序的状态,需要的朋友可以参考下
    2023-07-07
  • SpringBoot环境搭建图文教程

    SpringBoot环境搭建图文教程

    这篇文章主要为大家详细介绍了SpringBoot环境搭建图文教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-01-01
  • SpringBoot+Vue项目部署实现传统方式

    SpringBoot+Vue项目部署实现传统方式

    我们在进行前后端分离开发的时候,一般是将前端项目部署到nginx服务器上,与后端项目分开部署,这篇文章主要给大家介绍了关于SpringBoot+Vue项目部署实现传统方式的相关资料,需要的朋友可以参考下
    2024-01-01
  • Java 进行时间处理的步骤

    Java 进行时间处理的步骤

    时间处理是常见的需求,本文将讲述Java语言如何进行时间处理,感兴趣的朋友可以了解下
    2021-05-05

最新评论