web项目打包后资源文件读取问题(URI is not hierarchical)

文章讲述了在web项目部署到服务器后,由于资源文件被打包在jar中jar导致的URIisnothierarchical错误。提供了解决方案,包括手动复制文件和使用输入流读取。推荐使用输入流方式,因为空它可以在所有环境中通用,尽管需要额外的类型转换。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

项目场景:

        web项目,本地开发没问题,打包部署到服务器后,资源文件读取不到报错。

        报错:URI is not hierarchical


问题描述

报错:URI is not hierarchical

ClassPathResource resource = new ClassPathResource(zzz.txt);
File file = resource.getFile(); //报错:URI is not hierarchical

原因分析:

资源文件zzz.txt打包后会打在xxx.jar\BOOT-INFO\lib\yyy.jar\zzz.txt,而系统默认会去找xxx.jar\BOOT-INFO\classes\位置,jar中jar的文件以File file = new File(filePath)的方式是读取不到的。


解决方案:

两种解决方案:

一. 打包后将文件手动复制到系统能找到的位置:xxx.jar\BOOT-INFO\classes\zzz.txt

二. 将文件以输入流方式读取,可以读取到文件流

方法一就不介绍了,说一下方法二:

ClassPathResource resource = new ClassPathResource(zzz.txt);
InputStream is = resource.getInputStream();
// 其他操作
// is...

优缺点对比:

优缺点对比
优点缺点
方法一简单粗暴,不用改代码每次打包都要记着放进去
方法二所有环境通用,一次编译,到处运行以输入流的形式获取资源,需要转换为你要的类型

总结:

综上所述,还是改代码可靠,以后直接用方法二就行了

### Java 中 `java.lang.IllegalArgumentException: URI is not hierarchical` 的解决方案 当遇到 `java.lang.IllegalArgumentException: URI is not hierarchical` 错误时,通常是因为尝试通过不支持的操作来处理特定类型的 URI。对于这种情况,有几种常见原因和相应的解决办法。 #### 原因分析 1. **路径解析问题** 尝试创建文件对象时使用的字符串可能无法被解释为有效的分层 URI。这可能是由于路径格式不对或是因为程序试图在一个不允许的地方操作文件系统[^4]。 2. **资源加载方式不当** 如果是在读取位于 JAR 文件内部的资源,则不应使用 `File` 类来进行访问,而是应该采用适合于类路径资源的方式获取输入流[^2]。 3. **HTTP请求配置失误** 对于某些框架如 Spring Boot,在设置外部服务调用 URL 时如果指定了相对路径而非完整的绝对路径也可能引发此类异常[^5]。 #### 解决方案建议 ##### 方法一:修正本地文件系统的路径表达形式 确保所提供的路径能够形成合法的分层结构,并且确实指向存在的位置: ```java import java.io.File; public class Main { public static void main(String[] args){ String path = "/absolute/path/to/your/resource"; // 使用绝对路径代替相对路径 File file = new File(path); System.out.println(file.exists()); } } ``` ##### 方法二:正确加载 ClassPath 下的资源 针对被打包进 JAR 文件内的资源,推荐利用 `ClassLoader.getResourceAsStream()` 或者其他类似的 API 来替代直接实例化 `File` 对象的做法: ```java InputStream inputStream = getClass().getClassLoader() .getResourceAsStream("template/LZGICAD1.mdb"); if (inputStream != null) { try { // 处理 InputStream... } finally { inputStream.close(); } } else { throw new RuntimeException("Resource not found!"); } ``` ##### 方法三:调整 HTTP 请求中的 URL 设置 确认所有的远程接口调用都提供了完整的、包含协议部分(比如 http:// 或 https://)在内的全限定域名作为目标地址。 #### 注意事项 - 当应用程序被打包并部署到不同环境中测试或生产环境时,务必验证所有涉及文件 I/O 和网络通信的部分是否仍然正常工作。 - 需要特别注意区分开发阶段与实际运行环境下资源配置的不同之处,尤其是在构建工具自动管理依赖关系的情况下更应如此。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值