`
kanpiaoxue
  • 浏览: 1777511 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

springboot读取可运行jar里面的resources内的文件

 
阅读更多

使用eclipse等IDE开发Springboot的web系统的时候,需要下载位于resources/下面excel文件。在IDE中运行springboot程序,一切正常,但是打包成execute jar 之后就报错,找不到文件。

原因:使用File file来现在文件,会去判断文件是否存在。在文件系统中是好用的,但是在打包jar之后就不好用了。那么该如何读取jar里面resources下面的文件呢?

String data = "";
ClassPathResource cpr = new ClassPathResource("static/file.txt");
try {
    byte[] bdata = FileCopyUtils.copyToByteArray(cpr.getInputStream());
    data = new String(bdata, StandardCharsets.UTF_8);
} catch (IOException e) {
    LOG.warn("IOException", e);
}

代码如上,就可以读取jar里面resources下面的文件。

关键:不能使用file来读取file的内容,应该直接使用InputStream来读取。

public ResponseEntity<byte[]> download(String fileName, String folderPath)
         throws Exception {
     checkStringArgs(fileName, "fileName");
     checkStringArgs(folderPath, "folderPath");
     
     // 下载文件路径
     URL url = Resources.getResource(folderPath + File.separator + fileName);
     LOGGER.debug("url:{}",url);
     //读取流中的内容
     byte[] contents = FileCopyUtils.copyToByteArray(url.openStream());
     HttpHeaders headers = new HttpHeaders();
     // 通知浏览器以attachment(下载方式)
     headers.setContentDispositionFormData("attachment", fileName);
     // application/octet-stream : 二进制流数据(最常见的文件下载)。
     headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
     return new ResponseEntity<byte[]>(contents, headers, HttpStatus.CREATED);
}

 参考地址:

Classpath resource not found when running as jar:https://stackoverflow.com/questions/25869428/classpath-resource-not-found-when-running-as-jar

 

写道
resource.getFile() expects the resource itself to be available on the file system, i.e. it can't be nested inside a jar file. This is why it works when you run your application in STS but doesn't work once you've built your application and run it from the executable jar. Rather than using getFile() to access the resource's contents, I'd recommend using getInputStream() instead. That'll allow you to read the resource's content regardless of where it's located.

 

分享到:
评论

相关推荐

    解决SpringBoot打成jar运行后无法读取resources里的文件问题

    在使用SpringBoot进行开发时,我们经常会遇到在开发环境中能够正常读取resources目录下的文件,但是一旦将应用打包成jar文件并部署到服务器上运行时,就无法访问到这些资源文件的问题。这是因为SpringBoot的打包机制...

    spring读取jar中的配置文件

    总结起来,Spring提供了多种方式读取JAR内配置文件,包括`@PropertySource`、`@ConfigurationProperties`以及直接使用`Resource`接口。理解这些方法的使用和它们之间的差异对于开发和维护复杂的Spring应用至关重要。...

    springboot项目打成jar包后无法获取static下的静态资源文件的问题分析

    这个问题在开发和部署时非常常见,因为Spring Boot应用在运行时,会将静态资源打包到jar文件内部,直接使用文件路径读取方式将无法访问到这些资源。 首先,要理解Spring Boot应用打包后的资源访问机制。当Spring ...

    springboot 项目实现文件上传,显示,下载,打包为jar

    运行`mvn clean package`命令,将会生成一个名为`my-app.jar`的可执行JAR文件,包含了整个应用及其依赖,可以直接运行。 总结起来,Spring Boot提供了便捷的方法来处理文件上传、显示和下载。通过自定义静态资源...

    Springboot读取配置文件及自定义配置文件的方法

    这两个文件位于`src/main/resources`目录下,它们包含了一系列键值对,键通常是小写字母和下划线分隔的驼峰命名(如`server.port=8080`)。`application.yml`文件使用YAML格式,提供了更友好的层次结构,而`...

    SpringBoot上传文件到本服务器 目录与jar包同级问题

    因为我们无法对 jar 包里面的资源进行操作,而对于 SpringBoot 项目来说,我们只能读取里面的文件,只能使用 InputStream。 原因是我们无法操作 jar 包内容,所以我们只能将文件存放在别的位置,与 jar 包同级的...

    Spring Boot 读取静态资源文件的方法

    我们需要注意的是,如果静态资源文件在文件系统中,那么我们可以使用 getFile() 方法来获取文件对象,但是如果我们将项目打包成 JAR 包并将其部署到服务器上运行,那么我们将无法使用 getFile() 方法来获取文件对象...

    springboot在线展示pdf

    通过内嵌Tomcat服务器,SpringBoot可以快速启动并运行Web应用。 接下来,我们关注PDF.js,这是一个开源的JavaScript库,由Mozilla维护,主要用于在Web浏览器中以高质量的方式展示PDF文档,无需依赖任何插件。它支持...

    如何解决springboot读取配置文件的中文乱码问题

    然而,当配置文件包含中文字符时,可能会遇到读取时出现乱码的问题。这个问题主要是由于文件编码不一致或者系统默认编码不支持中文所导致的。下面将详细介绍如何解决Spring Boot读取配置文件时的中文乱码问题。 ...

    基于SpringBoot+JSP实现员工管理以及文件上传与下载

    - SpringBoot应用可以被打包为可执行的jar或war文件,然后部署到服务器,如Tomcat或Jetty。 项目的源代码`ems`可能包含了以下部分: - `src/main/java`:包含主类、控制器、服务、DAO以及实体类等。 - `src/main/...

    基于 SpringBoot 开发的超简洁音乐播放器

    SpringBoot 支持内嵌的 Tomcat、Jetty 或 Undertow 等 Servlet 容器,这意味着开发人员无需额外部署到外部服务器,可以直接运行 `jar` 文件启动服务。这对于快速测试和部署音乐播放器应用非常方便。 【Spring Data ...

    springboot学习源码

    SpringBoot是Java开发中的一个流行框架,它简化了Spring应用的初始搭建以及开发过程,使得开发者可以快速构建可运行的应用程序。SpringBoot的核心理念是“约定优于配置”,它默认配置了许多常见功能,同时允许通过...

    springboot部署linux访问服务器资源的方法

    spring.resources.static-locations=classpath:/static,classpath:/public,classpath:/resources,classpath:/META-INF/resources,file:${web.upload-path} ``` 这样,在访问 `ip/pic/cat.jpg` 时,可以访问到服务器...

    SpringBoot技术分享(培训ppt文档).pptx

    由于Spring Boot内置了一个内嵌的Tomcat web容器,因此我们无需将应用打包成war文件,而是可以直接以jar包的形式运行,这极大地简化了部署过程。 Spring Boot的主要优点在于简化配置、编码和部署。在没有Spring ...

    SpringBoot.docx

    1. 使用`java -jar`命令运行打包后的JAR文件。 2. 通过IDE的“运行”或“调试”功能运行。 【目录结构】 Spring Boot项目的标准目录结构包括: 1. `src/main/java`:源代码目录,包含主类和各模块代码。 2. `src/...

    Springboot + rxtx 实现串口读写应用部分源码

    - 注意平台兼容性:RXTX 库有特定于操作系统的 JAR 文件,确保使用对应系统版本的库。 3. **创建串口服务**: - 定义串口服务接口:定义一组方法,如 `openPort()`, `writeData()`, `readData()`, `closePort()` ...

    SpringBoot启动图标修改

    Spring Boot会自动读取这个文件并在启动时打印。文本 Banner 可以包含ANSI转义码来实现颜色效果。 2. **图片方式修改:** 如果你想使用图像作为启动图标,可以选择PNG或JPEG格式的图片。将图片文件(例如:`logo....

    Springboot项目打war包docker包找不到resource下静态资源的解决方案

    解决这个问题有多种策略,这里介绍一种通过读取资源文件并将其存储为临时文件的方法: 1. 首先,尝试通过修改Spring Boot的配置文件来解决。可以在`application.properties`或`application.yml`中设置静态资源路径...

    Springboot+freemarker生成word

    最后,运行`WordUtil`类中的`main`函数,调用`WordService.generateWord()`方法,传入必要的参数,就可以生成包含图片的Word文档了。 这个项目为我们提供了一个实用的工具,可以方便地根据模板生成动态的Word文档,...

    基于springboot搭建属于自己的博客网站.zip

    6. 部署项目,SpringBoot应用可以直接打包为可执行的JAR或WAR文件,部署到服务器。 为了运行此项目,你需要先安装Java环境和Git,然后克隆项目,使用Maven或Gradle构建项目,最后通过运行主类启动应用。如果项目...

Global site tag (gtag.js) - Google Analytics