解决Springboot项目打成jar包后获取resources目录下的文件报错的问题

这篇具有很好参考价值的文章主要介绍了解决Springboot项目打成jar包后获取resources目录下的文件报错的问题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前几天在项目读取resources目录下的文件时碰到一个小坑,明明在本地是可以正常运行的,但是一发到测试环境就报错了,说找不到文件,报错信息是:class path resource [xxxx] cannot be resolved to absolute file path because it does not reside in the file system: jar:file:xxxx.jar!/BOOT-INF/classes!xxxx。

看了半天代码感觉没有问题,于是怀疑是打成项目jar包后和原项目存在差异导致的。于是我把的项目打成jar包,在本地直接调试jar,果然发现问题所在。下面我将以一个自己的测试项目api-test替代原来的公司项目来讲述一下排查过程。

一、项目代码

GetResourceTest:

public class GetResourceTest {
    public InputStream getResource1() throws IOException {
        File file = new DefaultResourceLoader().getResource("/template/qiankuan.ftl").getFile();
        return Files.newInputStream(file.toPath());
    }


    public InputStream getResource2() throws IOException {
        ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
        Resource[] resources = resolver.getResources("/template/qiankuan.ftl");
        Resource resource = resources[0];
        return resource.getInputStream();
    }
}

TestController:

@RestController
@RequestMapping("/test")
public class TestController {
    @GetMapping(value = "/getResource")
    @ResponseBody
    public void getResource() throws IOException {
        GetResourceTest getResourceTest = new GetResourceTest();
        getResourceTest.getResource1();
    }
}

二、排查过程

1、首先使用Maven的install命令将项目打成jar包

解决Springboot项目打成jar包后获取resources目录下的文件报错的问题

命令执行成功后再target目录下就生成了jar包
解决Springboot项目打成jar包后获取resources目录下的文件报错的问题

2、在Termininal里cd到target目录下,然后执行下面的代码,9992可以替换成其他端口

java -jar -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=9992 api-test-1.0.0-SNAPSHOT.jar

执行成功如下
解决Springboot项目打成jar包后获取resources目录下的文件报错的问题

3、添加远程调试

依次点击菜单Run,点击Edit Configurations,点击+,点击Remote JVM Debug,端口后改成刚刚设置的9992。
解决Springboot项目打成jar包后获取resources目录下的文件报错的问题

4、请求接口

请求测试接口,9991是项目原来的端口

127.0.0.1:9991/test/getResource

5、请求结果

请求果然报错了,报错和之前测试环境的报错一摸一样。其实我们通过这个报错已经可以大致上看出问题了。。。
解决Springboot项目打成jar包后获取resources目录下的文件报错的问题

6、断点调试

在请求的入口打上断点开始断点调试
解决Springboot项目打成jar包后获取resources目录下的文件报错的问题

通过断点调试也可以看到这个文件地址在原来的地址/template/qiankuan.ftl 前拼接了jar:file:/D:/Project/test/fhey-test/api-test/target/api-test-1.0.0-SNAPSHOT.jar!/BOOT-INF/classes!成为了jar:file:/D:/Project/test/fhey-test/api-test/target/api-test-1.0.0-SNAPSHOT.jar!/BOOT-INF/classes!/template/qiankuan.ftl。

解决Springboot项目打成jar包后获取resources目录下的文件报错的问题

然后在后面一段代码中,resourceUrl.getProtocol()的返回结果是"jar"而不是"file", 被判定为不是文件然后抛出了一个FileNotFoundException异常。
解决Springboot项目打成jar包后获取resources目录下的文件报错的问题
解决Springboot项目打成jar包后获取resources目录下的文件报错的问题

三、解决方法

ResouceUtils.getFile()是专门用来加载非压缩和Jar包文件类型的资源,所以它根本不会去尝试加载Jar中的文件,要想加载Jar中的文件,只要用可以读取jar中文件的方式加载即可,比如 可以采用ClassPathResource这种以流的形式读取文件的方式或者PathMatchingResourcePatternResolver来读取文件。

ClassPathResource classPathResource = new ClassPathResource("/template/qiankuan.ftl" );
InputStream inputStream = classPathResource.getInputStream();

或者文章来源地址https://www.toymoban.com/news/detail-515904.html

ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
Resource[] resources = resolver.getResources("/template/qiankuan.ftl");
Resource resource = resources[0];
InputStream inputStream = resource.getInputStream();

到了这里,关于解决Springboot项目打成jar包后获取resources目录下的文件报错的问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 解决java在idea运行正常,但是打成jar包后中文乱码问题

    目录 比如: 打包命令使用utf-8编码: 1.当在idea中编写的程序,运行一切正常.但是当被打成jar包时,执行的程序会中文乱码.产生问题的原因和解决方案是什么呢? 一.问题分析 分别使用idea和jar包形式打印出System中所有的jvm参数---代码如下:     idea的打印结果: jvm---key是: user.name

    2024年02月05日
    浏览(35)
  • SpringBoot项目打成jar包之后无法读取资源文件【jar包文件的读取方式】

    将文件放在resources目录下,确保资源文件被打包到jar包中 如何判断资源是否在jar包中,只需要解压jar包,然后查询资源名称即可 读取文件的时候写成绝对路径,肯定是不行的,这个很容易理解。 那读取文件的时候写相对路径是否可以呢?答案也是不行,见下面解释。 这是原

    2024年02月14日
    浏览(39)
  • Springboot获取jar包中resources资源目录下的文件

            今天在项目中遇到一个业务场景,需要用到 resources 资源目录 下的文件,然后就在思考一个问题:         当项目打成jar后,Springboot要如何获取resources 资源目录下的文件呢?         如题,如何在项目打成jar包之后,在代码中依然能够获取到jar包中resources资源目录

    2024年02月11日
    浏览(38)
  • idea把项目打成jar包步骤详解

            最近产品需要预研一个小功能,开始后在本地开发测试好之后,需要打成jar提供出去,今天弄完了,决定把这个步骤记录下来,便于以后轻车熟路。         打成jar要有mian方法的入口,所以我们在代码中需要定义一个main方法,然后通过这个main方法调用我们的核心逻

    2024年02月08日
    浏览(38)
  • jar包获取resource下配置文件路径

    我们在代码里可以这样写 但是打成jar包后就不行了,我们有很多方法获取jar包路径或者resource下文件路径 但是打印后你会发现路径里面带 !,此时就算你去掉!也不行 就算把路径copy到linux,用cat命令也显示文件不合法,猜测打包之后的jar就是无法获取的 但是我们可以读取文

    2024年02月11日
    浏览(32)
  • 【已解决】Spring boot项目获取到resource目录下文件完整路径怎么获取 ?

    在实际开发过程中,可能有时候,我们将文件放在resource下,在程序中需要获取到文件路径然后操作。比如,将公钥放到resource文件夹下,在程序中需要获取到这个公钥的完整路径。怎么操作?   需要访问的文件位置 获取方法如下: 在yaml文件中配置公钥文件名称: pem:   

    2024年02月09日
    浏览(35)
  • 打成jar包运行之后报错,java.io.FileNotFoundException:(已解决)

    今天项目测试时,遇到一个问题,因为第一次遇到,所以记录一下: 1、问题情况如下:         存放在项目resources目录下的静态资源文件,需要在接口调用时,将其copy到其他文件位置,但是打包后运行,调用时报错FileNotFoundException。         开发中代码调试没有问题,但

    2024年02月15日
    浏览(47)
  • 使用docker-file 将springboot项目打成镜像,发布成容器服务

    [root@localhost ~]# uname -r 3.10.0-862.el7.x86_64 [root@localhost ~]# yum install docker [root@localhost export]# systemctl start docker [root@localhost export]# docker -v Docker version 1.13.1, build 7d71120/1.13.1 [root@localhost export]# systemctl status docker ● docker.service - Docker Application Container Engine    Loaded: loaded (/usr/lib/systemd

    2024年02月13日
    浏览(38)
  • IDEA打成JAR包

    一、场景需求 ​ 当我们需要将Java项目文件转为exe文件时,需要首先将Java项目文件打包成jar文件。这里我们以常用的Java开发IDE-IDEA为例,讲解打包jar文件的具体步骤。 二、具体步骤 在项目代码功能都测试无误后,接下来进行工程文件的打包。 菜单栏点击File后,选择Project

    2024年02月16日
    浏览(42)
  • 快速+完美+准确解决SpringBoot项目打包后的SNAPSHOT.jar中没有主清单属性的问题

    目录 问题再现 问题解决 结果 xxxx-0.0.1-SNAPSHOT.jar中没有主清单属性 1 出问题的pom.xml文件 2 正确的pom.xml文件 请注意改变了什么? 答:删除掉 skiptrue/skip 即可了 改完记得刷新xml文件!!!! 运行成功了, 同时我们发现了正确打包下的文件远比错误打包下的文件要大  

    2024年02月05日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包