首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >编译正常运行,打jar包运行报错(找不到文件路径)

编译正常运行,打jar包运行报错(找不到文件路径)

作者头像
VIBE
发布于 2022-11-18 06:07:03
发布于 2022-11-18 06:07:03
3.6K00
代码可运行
举报
文章被收录于专栏:算法与开发算法与开发
运行总次数:0
代码可运行

前言

博主个人社区:开发与算法学习社区 博主个人主页:Killing Vibe的博客 欢迎大家加入,一起交流学习~~

问题描述

Maven项目下,从resouces目录下把文件读入内存时,例如将sql文件用文件输入流读入时,编译时运行正常,但打成jar包后运行jar包报错:

Exception in thread “main” java.lang.RuntimeException:

java.io.FileNotFoundException


原因分析:

先上初始代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 InputStream in = new FileInputStream("src/main/resources/init.sql");

我们在获取文件输入流的时候大部分都会选择使用相对路径来读入一个文件(一般不使用绝对路径,可移植性太差)

这个时候,正常去在项目下编译运行时没有任何问题的,但我们把这个项目打包成可执行jar包的时候,在终端运行这个jar包,就会报错,系统找不到指定的这个文件路径:

原因就在于此时打包后的jar包默认是在target文件夹下,而我们的代码默认的工作目录项目的目录,所以一旦在jar包所在目录运行这个jar包,相对路径就不对了,就会报路径错误。

解决方案:

1.把这个jar包移动到工作目录上运行(很笨的方法)

2.下面推荐一种做法就是使用类加载器的方式引入资源文件

先上代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 InputStream in = DBUtil.class.getClassLoader().
                    getResourceAsStream("init.sql");

直接获取已有类的一个class对象的类加载器,然后用里面的 getResourceAsStream()方法 。

注:已有类就是项目文件夹下的任何一个类,比如我在src/main/java下写了一个叫做DBUtil的类

因为项目中的源文件打包编译之后都会放在 target 文件夹下的 classes 文件夹中(包括资源文件),而刚好这个jar包也是默认放在target文件夹下,所以两者工作目录相同,就不会报错

简单解释一下这个方法的原理:

  • 调用DBUtil.class.getClassLoader()就会获取到编译后的classes目录
  • 所谓的类加载器就是告诉JVM从哪个文件夹去执行class文件
  • getResourceAsStream()就是获取指定文件的输入流

总结

好处:这就是处理相对路径的通用写法!!

充分体现了Java的可移植性,无论哪个操作系统,哪个电脑,这样写一写百通~~~

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-11-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【SpringBoot】四种读取 Spring Boot 项目中 jar 包中的 resources 目录下的文件
在SpringBoot应用中,经常需要读取打包在jar包中的资源文件,比如配置文件、模板文件等。这些资源文件通常放在src/main/resources目录下,在打包成jar包后,它们会被存储在jar包的根目录下。本文将介绍4种在SpringBoot中读取这些资源文件的方法。
程序员洲洲
2024/06/07
6.9K0
【SpringBoot】四种读取 Spring Boot 项目中 jar 包中的 resources 目录下的文件
项目打包成 jar 后包无法读取src/main/resources下文件
该代码功能是利用 common.io 包下的FileUtils来读取文件, 放到一个字符串中
时间静止不是简史
2022/05/06
14.8K0
项目打包成 jar 后包无法读取src/main/resources下文件
踩坑集锦之你真的明白Java类路径的含义吗?
在Dubbo源码篇02—从泛化调用探究Wrapper机制的原理一文中,我们写过compileJava2Class这个方法,来编译,加载,实例化我们的代理对象的java文件:
大忽悠爱学习
2023/05/23
1.5K0
踩坑集锦之你真的明白Java类路径的含义吗?
【ClassLoader】实现自定义类加载器加载指定路径下的Class文件和Jar包[通俗易懂]
在web开发中,一般我们是不需要去自己实现类加载器的,常见的web容器已经帮我们实现了指定路径下的加载,比如我们熟悉的tomcat容器,关于tomcat类加载机制可以阅读博主的这篇文章: Java类加载机制和Tmcat模型
全栈程序员站长
2022/10/04
1.8K0
一文理解class.getClassLoader().getResourceAsStream(file)和class.getResourceAsStream(file)区别
另外,在使用springboot进行开发时,其目录默认不是WEB-INF而是BOOT-INF,但是其含义是一样的。具体如下图所示:
全栈程序员站长
2022/07/01
2.2K0
一文理解class.getClassLoader().getResourceAsStream(file)和class.getResourceAsStream(file)区别
解密 `java.io.FileNotFoundException`:从路径到权限,Java文件操作不再“迷路”(小白指南)
java.io.FileNotFoundException 是Java程序在尝试访问一个文件,但因各种原因(如文件确实不存在、路径指定错误、权限不足,或试图以文件方式访问打包在JAR/WAR内的资源)未能成功时抛出的一个受检异常 (Checked Exception)。这个异常在进行文件读写操作时非常普遍,尤其是对于初学者而言,理解和正确处理文件路径、区分文件系统路径与类路径资源是常见的痛点。本文将从“小白”视角出发,详细阐述此异常发生的核心原因,深入探讨绝对路径与相对路径的区别与使用,介绍Java中处理文件路径的最佳实践(包括传统的 File 类和现代的NIO.2 Path API),并重点讲解如何正确访问打包在应用程序(如JAR或WAR包)中的资源文件。通过具体的Java代码示例和清晰的排错思路,本指南旨在帮助你彻底理解并有效避免和解决 FileNotFoundException。
默 语
2025/06/12
2860
getClass()和getClassLoader()区别 以及ClassLoader详解及用途(文件加载,类加载)
获得ClassLoader的几种方法可以通过如下3种方法得到ClassLoader this.getClass().getClassLoader(); // 使用当前类的ClassLoader Thread.currentThread().getContextClassLoader(); // 使用当前线程的ClassLoader ClassLoader.getSystemClassLoader(); // 使用系统ClassLoader,即系统的入口点所使用的ClassLoader。(注意,system ClassLoader与根ClassLoader并不一样。JVM下system ClassLoader通常为App ClassLoader)
全栈程序员站长
2022/08/18
5.3K0
Java 中的 jar ,天天见,可是你知道它的运行机制吗?
今天介绍两个大家每天都在用但是却很少去了解它的知识点:spi 和 jar 运行机制,废话不多说,开始正题。
江南一点雨
2019/07/23
3.1K0
获取jar包内部的资源文件
通常获取一个资源文件很简单,问题是对于jar包内的资源文件,可能会发生意外。假如这里有一个文件操作的类:
用户7798898
2020/09/27
1.9K0
为什么SpringBoot jar包中的文件读取不到?
菜菜同学每天的工作便是与三方对接,而且这次的任务是接入 N 套证书相关配置文件。考虑到后期易于上线,于是菜菜开启了从硬编码到易维护的代码优化之路。
一猿小讲
2021/10/08
1.6K0
JVM(类的加载与ClassLoader、双亲委派机制)
类在内存中完整的生命周期:加载-->使用-->卸载。其中加载过程又分为:装载、链接、初始化三个阶段。
鱼找水需要时间
2023/06/01
3280
JVM(类的加载与ClassLoader、双亲委派机制)
获取当前jar包路径_java获取jar文件
获取classpath的路径,若没有其他依赖,在cmd下运行该可执行jar包,则该值即为该jar包的绝对路径。代码如下:
全栈程序员站长
2022/11/10
8.1K0
听说你java项目可以运行?打包成 jar后路径找不到问题的完美解决方案
加载本地包下的文件和打包成jar文件的路径是不一样的,需要对路径进行调整。 如果要判断为本地文件还是jar包文件可以参考以下代码 String protocol = Aviator.class.getResource("").getProtocol(); if ("jar".equals(protocol)) { //jar包加载 findClassJar(packageName); } else { //本地加
gfu
2019/08/28
4.9K0
jar包读取资源文件报错:找不到资源文件(No such file or directory)
(2)但是,Maven项目打成jar包后,放到服务器上运行时,却报错,找不到配置文件。
程裕强
2022/05/06
1.7K0
Java 优化:读取配置文件 "万能方式" 跨平台,动态获取文件的绝对路径
每个人的生活同样也是一个世界,即使最平凡的人,也得要为他那个世界的存在而战斗。从这个意义
RainbowSea
2023/02/22
8720
【小家Spring】资源访问利器---Spring提供的Resource接口以及它的常用子类源码分析
资源是一个抽象的概念,什么是资源?我们已知Spring中有很多xml配置文件,同时还可能自建各种properties资源文件,还有可能进行网络交互,收发各种文件、二进制流等。
YourBatman
2019/09/03
1.6K0
【小家Spring】资源访问利器---Spring提供的Resource接口以及它的常用子类源码分析
ClassLoader读取文件,springboot打jar包后读取不到
jar:file:/D:/test/test/.metadata/.plugins/org.eclipse.wst.server.core/test/test/test/WEB-INF/lib/test-0.0.1-SNAPSHOT.jar!/ca.crt
FHAdmin
2021/08/27
1.6K0
获取类路径某个json文件中的内容字符串
实际项目中可能会有需要读取类路径下面的配置文件中的内容的需求,由于springboot项目打包的是jar包,通过文件读取获取流的方式开发的时候没有问题,但是上到linux服务器上就有问题了,对于这个问题记录一下处理的方式
在水一方
2022/09/16
3.4K0
从Jar包冲突搞到类加载机制,就是这么霸气
接手了一套比较有年代感的系统,计划把重构及遇到的问题写成系列文章,老树发新枝,重温一些实战技术,分享给大家。【重构01篇】,给大家讲讲Jar包冲突及原理。
程序新视界
2021/12/07
2K0
从Jar包冲突搞到类加载机制,就是这么霸气
Java命令行运行错误: 找不到或无法加载主类
本部分将针对在“一”中提出的两个问题发生原因,分别进行分析及处理。并且会介绍java的一些和处理问题相关的基本概念。
全栈程序员站长
2022/09/19
11.2K0
Java命令行运行错误: 找不到或无法加载主类
推荐阅读
【SpringBoot】四种读取 Spring Boot 项目中 jar 包中的 resources 目录下的文件
6.9K0
项目打包成 jar 后包无法读取src/main/resources下文件
14.8K0
踩坑集锦之你真的明白Java类路径的含义吗?
1.5K0
【ClassLoader】实现自定义类加载器加载指定路径下的Class文件和Jar包[通俗易懂]
1.8K0
一文理解class.getClassLoader().getResourceAsStream(file)和class.getResourceAsStream(file)区别
2.2K0
解密 `java.io.FileNotFoundException`:从路径到权限,Java文件操作不再“迷路”(小白指南)
2860
getClass()和getClassLoader()区别 以及ClassLoader详解及用途(文件加载,类加载)
5.3K0
Java 中的 jar ,天天见,可是你知道它的运行机制吗?
3.1K0
获取jar包内部的资源文件
1.9K0
为什么SpringBoot jar包中的文件读取不到?
1.6K0
JVM(类的加载与ClassLoader、双亲委派机制)
3280
获取当前jar包路径_java获取jar文件
8.1K0
听说你java项目可以运行?打包成 jar后路径找不到问题的完美解决方案
4.9K0
jar包读取资源文件报错:找不到资源文件(No such file or directory)
1.7K0
Java 优化:读取配置文件 "万能方式" 跨平台,动态获取文件的绝对路径
8720
【小家Spring】资源访问利器---Spring提供的Resource接口以及它的常用子类源码分析
1.6K0
ClassLoader读取文件,springboot打jar包后读取不到
1.6K0
获取类路径某个json文件中的内容字符串
3.4K0
从Jar包冲突搞到类加载机制,就是这么霸气
2K0
Java命令行运行错误: 找不到或无法加载主类
11.2K0
相关推荐
【SpringBoot】四种读取 Spring Boot 项目中 jar 包中的 resources 目录下的文件
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档