spring 读取jar包内部的静态文件失败

简介: spring 读取jar包内部的静态文件失败

问题描述:最近打包项目发现,本地正常执行的代码,打成jar包执行会出现文件读取失败的问题。

package com.liu.springboot.controller;
import org.springframework.core.io.ClassPathResource;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import java.io.*;
/**
*将static中的favicon.ico 复制到D盘
*
*/
@Controller
public class TestFile {
    @RequestMapping("/getFile")
    @ResponseBody
    public String read() {
        ClassPathResource classPathResource = new ClassPathResource("static/favicon.ico");
        File copy = new File("D://copy.ico");
        OutputStream outputStream = null;
        InputStream inputStream = null;
        int len;
        byte[] buf = new byte[100];
        try {
            outputStream = new FileOutputStream(copy);
            File file = classPathResource.getFile();
            inputStream = new FileInputStream(file);
            while ((len = inputStream.read(buf))>0) {
                outputStream.write(buf,0,len);
            }
//            System.out.println("ok");
            return  "ok";
        }catch (IOException io) {
            return  "false";
        } finally {
            try {
                outputStream.close();
                inputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

在idea中执行是ok的

可是打包后就会出现异常

发现这行代码出现问题,报了空指针

File file = classPathResource.getFile();

解决办法:

 outputStream = new FileOutputStream(copy);
//File file = classPathResource.getFile();
//inputStream = new FileInputStream(file);
//直接得到输入流
 inputStream = classPathResource.getInputStream();
 while ((len = inputStream.read(buf))>0) {
     outputStream.write(buf,0,len);
 }

这样就可以了,其实发现完全没必要使用classPathResource.getFile(),直接 classPathResource.getInputStream();就行了。

如果你在某种情况下实在需要以File形式,那么你可以将从 classPathResource.getInputStream();获得的流里的内容,复制一份到文件中,也就是上文做的工作·,然后再操作(读)这个文件的拷贝文件。

暂时记录下,以后再详细查找原因

目录
打赏
0
0
0
0
0
分享
相关文章
|
8月前
|
Spring boot 运行服务jar外配置配置文件方式总结
Spring boot 运行服务jar外配置配置文件方式总结
1025 0
学习Spring框架特性及jiar包下载
Spring 5作为最新版本,更新了JDK基线至8,修订了核心框架,增强了反射和接口功能,支持响应式编程及Kotlin语言,引入了函数式Web框架,并提升了测试功能。Spring框架可在其官网下载,包括文档、jar包和XML Schema文档,适用于Java SE和Java EE项目。
56 0
Java/Spring项目的包开头为什么是com?
本文介绍了 Maven 项目的初始结构,并详细解释了 Java 包命名惯例中的域名反转规则。通过域名反转(如 `com.example`),可以确保包名的唯一性,避免命名冲突,提高代码的可读性和逻辑分层。文章还讨论了域名反转的好处,包括避免命名冲突、全球唯一性、提高代码可读性和逻辑分层。最后,作者提出了一个关于包名的问题,引发读者思考。
283 0
Java/Spring项目的包开头为什么是com?
|
8月前
|
[JarEditor]可直接修改jar包的IDEA插件
### 修改JAR包变得更简单:JarEditor插件简介 **背景:** 开发中常需修改JAR包中的class文件,传统方法耗时费力。JarEditor插件让你一键编辑JAR包内文件,无需解压。 **插件使用:** 1. **安装:** 在IDEA插件市场搜索JarEditor并安装。 2. **修改class:** 打开JAR文件中的class,直接编辑,保存后一键构建更新JAR。 3. **文件管理:** 右键菜单支持在JAR内新增/删除/重命名文件等操作。 4. **搜索:** 使用内置搜索功能快速定位JAR包内的字符串。
681 2
[JarEditor]可直接修改jar包的IDEA插件
Serverless 应用引擎操作报错合集之上传自定义JAR包,启动时报错,是什么导致的
Serverless 应用引擎(SAE)是阿里云提供的Serverless PaaS平台,支持Spring Cloud、Dubbo、HSF等主流微服务框架,简化应用的部署、运维和弹性伸缩。在使用SAE过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
PolarDB产品使用问题之部署到服务器上的Java应用(以jar包形式运行)无法连接,如何解决
PolarDB产品使用合集涵盖了从创建与管理、数据管理、性能优化与诊断、安全与合规到生态与集成、运维与支持等全方位的功能和服务,旨在帮助企业轻松构建高可用、高性能且易于管理的数据库环境,满足不同业务场景的需求。用户可以通过阿里云控制台、API、SDK等方式便捷地使用这些功能,实现数据库的高效运维与持续优化。
【Azure 应用服务】App Service 部署txt静态文件和Jar包在不同目录中的解决办法
【Azure 应用服务】App Service 部署txt静态文件和Jar包在不同目录中的解决办法
【Azure 应用服务】App Service For Windows 中如何设置代理实现前端静态文件和后端Java Spring Boot Jar包
【Azure 应用服务】App Service For Windows 中如何设置代理实现前端静态文件和后端Java Spring Boot Jar包
【Azure 应用服务】记一次Azure Spring Cloud 的部署错误 (az spring-cloud app deploy -g dev -s testdemo -n demo -p ./hellospring-0.0.1-SNAPSHOT.jar --->>> Failed to wait for deployment instances to be ready)
【Azure 应用服务】记一次Azure Spring Cloud 的部署错误 (az spring-cloud app deploy -g dev -s testdemo -n demo -p ./hellospring-0.0.1-SNAPSHOT.jar --->>> Failed to wait for deployment instances to be ready)
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等