首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >jar包读取资源文件报错:找不到资源文件(No such file or directory)

jar包读取资源文件报错:找不到资源文件(No such file or directory)

作者头像
程裕强
发布于 2022-05-06 12:14:46
发布于 2022-05-06 12:14:46
1.7K00
代码可运行
举报
运行总次数:0
代码可运行

1、遇到问题

(1)Maven项目开发阶段正常运行,Java程序可以读取配置文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Main {

    public static void main(String[] args) throws Exception {

        Main.readFile("resources/sharepointApp.xml");
    }

    public static byte[] readFile(String fileName) throws Exception {
        String path = SharepointApp.class.getClassLoader().getResource(fileName).getPath();
        System.out.println(path);
        File file = new File(path);
        byte[] buf = new byte[(int) file.length()];
        InputStream input=new FileInputStream(fileName);
        input.read(buf);
        input.close();
        return buf;
    }
}

(2)但是,Maven项目打成jar包后,放到服务器上运行时,却报错,找不到配置文件。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@SearchEngine-TEST ~]# java -jar webservice-0.0.1-SNAPSHOT-jar-with-dependencies.jar 
file:/root/webservice-0.0.1-SNAPSHOT-jar-with-dependencies.jar!/resources/sharepointApp.xml
Exception in thread "main" java.io.FileNotFoundException: file:/root/webservice-0.0.1-SNAPSHOT-jar-with-dependencies.jar!/resources/sharepointApp.xml (No such file or directory)
    at java.io.FileInputStream.open0(Native Method)
    at java.io.FileInputStream.open(FileInputStream.java:195)
    at java.io.FileInputStream.<init>(FileInputStream.java:138)
    at java.io.FileInputStream.<init>(FileInputStream.java:93)
    at com.cntaiping.tpa.webservice.SharepointApp.readFile(SharepointApp.java:53)
    at com.cntaiping.tpa.webservice.SharepointApp.sendSms(SharepointApp.java:30)
    at Main.main(Main.java:22)
[root@SearchEngine-TEST ~]#

(3)查看jar结构,对应配置文件存在。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@SearchEngine-TEST ~]# jar tf webservice-0.0.1-SNAPSHOT-jar-with-dependencies.jar
。。。
DownloadDemo.class
Main.class
META-INF/maven/cn.hadron/webservice/pom.properties
META-INF/maven/cn.hadron/webservice/pom.xml
resources/a.xml
resources/result.xml
resources/sharepoint.xml
resources/sharepointApp.xml
resources/table.xml
Test.class
META-INF/maven/commons-io/
META-INF/maven/commons-codec/
META-INF/maven/commons-codec/commons-codec/
META-INF/maven/commons-io/commons-io/
META-INF/maven/commons-logging/
META-INF/maven/com.github.virtuald/
META-INF/maven/com.github.virtuald/curvesapi/
META-INF/maven/commons-logging/commons-logging/
[root@SearchEngine-TEST ~]#

2、问题分析

由上面运行jar包输出/root/webservice-0.0.1-SNAPSHOT-jar-with-dependencies.jar!/resources/sharepointApp.xml可知,该值是我们通过自定义方法readFile()读取的文件路径,显然这个值不是一般意义上的URL地址。所以jar包中的类源代码用File f=new File(项目内地址)的形式,是不可能定位到文件资源的。

3、解决办法

jar中资源有其专门的URL形式:jar:<url>!/{entry} 可以通过Class类的getResourceAsStream()方法来获取资源文件输入流方式读取文件。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class FileUtil {
    /**
     * 读取配置文件
     * @return
     */
    public static byte[] readConfigFile(String cfgFile) {
        try {
            InputStream in=FileUtil.class.getClassLoader().getResource(cfgFile).openStream();
            BufferedReader br=new BufferedReader(new InputStreamReader(in));
            StringBuilder sb=new StringBuilder();        
            String line="";
            while((line=br.readLine())!=null) {
                sb.append(line);
            }
            return sb.toString().getBytes();
        } catch (IOException e) {
            e.printStackTrace();
            return null;
        }
    }

    //省略其他的方法

    //主方法
    public static void main(String[] args) throws IOException {
         byte[] buf = FileUtil.readConfigFile("resources/sharepointApp.xml");

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

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

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Jar 包加密
字节码混淆就是对类名、字段名、方法名进行替换,让其变得无意义,使其他人反编译后很难读懂,但并不影响逻辑。
wsuo
2023/04/16
4.3K0
实战spring自定义属性(schema):快速体验
在开发dubbo服务的时候,我们会在xml中做以下类似的配置: <dubbo:application name="dubbo_service_provider" /> <dubbo:registry
程序员欣宸
2018/01/04
1.3K0
实战spring自定义属性(schema):快速体验
hadoop:将WordCount打包成独立运行的jar包
hadoop示例中的WordCount程序,很多教程上都是推荐以下二种运行方式: 1.将生成的jar包,复制到hadoop集群中的节点,然后运行 $HADOOP_HOME/bin/hadoop xxx.jar xxx.WordCount /input/xxx.txt /output 2.或者直接在IDE环境中调试(参见eclipse/intellij idea 远程调试hadoop 2.6.0) 但是生产环境中,更多的情况是:没有ide环境,且各应用最终生成的jar包部署在应用服务器上(应用服务器并非had
菩提树下的杨过
2018/01/19
2.2K0
hadoop:将WordCount打包成独立运行的jar包
SSM项目搭建一(终) 原
        项目搭建使用的不仅仅只是前面所说的那些,还有一下比如gson或jackson、个人类库、定时器等等,这里就不一一赘述了。下面看整个项目的配置。
尚浩宇
2018/08/17
4140
Spring+SpringMVC+MyBatis+easyUI整合基础篇(六)maven整合SSM
前言   承接前文《Spring+SpringMVC+MyBatis+easyUI整合基础篇(五)讲一下maven》,本篇所讲述的是如何使用maven与原ssm项目整合,使得一个普通的JavaWeb项目变为由maven管理的规范化项目,使项目变得简单。如果你已经安装maven并在开发软件中配置好maven后,即可开始体验maven带给你的便利,当然,仅仅一个项目是不可能让你迅速喜欢上maven的,这一篇只是上车而已,慢慢来。   因为已经有了项目代码,所以新建maven步骤这里可以忽略的看一下,你可以自
程序员十三
2018/03/15
1.4K0
Spring+SpringMVC+MyBatis+easyUI整合基础篇(六)maven整合SSM
为什么SpringBoot jar包中的文件读取不到?
菜菜同学每天的工作便是与三方对接,而且这次的任务是接入 N 套证书相关配置文件。考虑到后期易于上线,于是菜菜开启了从硬编码到易维护的代码优化之路。
一猿小讲
2021/10/08
1.6K0
spring-boot-starter大力出奇迹
​  上篇文章我们已经聊了SpringBoot的启动过程中的各类扩展点,那么从http://start.spring.io上我们生成的demo项目中,到目前就剩下了maven工程的pom.xml还没有进行探索了,那么本文我们就来看看这里面到底都有啥,把大力出奇迹的常见spring-boot-starter来聊一聊,以便更好地使用SpringBoot.
阿豪聊干货
2018/08/09
1K0
很详细的SpringBoot整合UEditor教程
UEditor只提供JSP版本的后端入口代码。但提供了项目源码,因此可以根据业务需求修改源代码。
凯哥Java
2019/06/28
3.3K0
很详细的SpringBoot整合UEditor教程
docker下使用disconf:细说demo开发
本文介绍了如何使用disconf实现本地配置文件与部署在服务器上的配置文件进行交互,以及使用disconf-nginx实现文件代理,还通过一个demo展示了如何使用disconf进行配置下发,最后对全文进行了总结。
程序员欣宸
2018/01/04
8940
docker下使用disconf:细说demo开发
Spring Boot 项目访问依赖 jar 包内部的资源文件的路径问题详解
Spring Boot 项目访问依赖 jar 包内部的资源文件的路径问题详解 核心代码行: Resource[]resources =new PathMatchingResourcePatternResolver().getResources(ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX +"META-INF/driver.properties"); 直接上源码: package com.bytedance.kunlun.engine.driverm
一个会写诗的程序员
2021/07/15
1.4K0
手把手教你搭建分布式项目环境
根据电商项目模拟练习后 ,根据个人总结和经验重新进行了分布式项目的框架搭建 , 现总结过程步骤 ,为以后进行相关类型的开发做好基础~~~
时间静止不是简史
2020/07/27
1.5K0
手把手教你搭建分布式项目环境
使用Spring Boot创建docker image
在很久很久以前,我们是怎么创建Spring Boot的docker image呢?最最通用的办法就是将Spring boot的应用程序打包成一个fat jar,然后写一个docker file,将这个fat jar制作成为一个docker image然后运行。
程序那些事
2020/11/03
1.6K0
使用Spring Boot创建docker image
java9系列(八)Multi-Release JAR Files
java9新支持了multi-release jar的功能,包括jar、javac、javap、jdeps等命令都能支持这个特性。所谓multi-release jar可以包含多个jdk版本的实现,在运行时JVM根据当前环境加载符合版本的class,这样可以使得jar包在兼容旧版本的同时尽可能早地尝试新版JDK的特性。
code4it
2018/09/17
1.2K0
2021年 最新 多阶段构建dockerfile实现java源码编译打jar包并做成镜像
多阶段构建指在Dockerfile中使用多个FROM语句,每个FROM指令都可以使用不同的基础镜像,并且是一个独立的子构建阶段。使用多阶段构建打包Java应用具有构建安全、构建速度快、镜像文件体积小等优点.
猫头虎
2024/04/07
5520
2021年 最新 多阶段构建dockerfile实现java源码编译打jar包并做成镜像
TestNG跑个Demo并打个Jar包
新建Maven项目的步骤,省略。 浏览器访问https://mvnrepository.com/search?q=testng获取maven,选择相应版本,拿到依赖: 添加到pom.xml中: po
dongfanger
2020/09/23
9280
TestNG跑个Demo并打个Jar包
springboot的jar为何能独立运行
在开发springboot应用时,通过java -jar命令启动应用是常用的方式,今天就来一起了解这个简单操作背后的技术;
程序员欣宸
2021/05/13
8070
springboot的jar为何能独立运行
聊聊如何避免多个jar通过maven打包成一个jar,多个同名配置文件发生覆盖问题
不知道大家在开发的过程中,有没有遇到这种场景,外部的项目想访问内部nexus私仓的jar,因为私仓不对外开放,导致外部的项目没法下载到私仓的jar,导致项目因缺少jar而无法运行。
lyb-geek
2023/02/28
2K0
聊聊如何避免多个jar通过maven打包成一个jar,多个同名配置文件发生覆盖问题
Maven基本知识
​ 将 apache-maven-3.5.0-bin.zip 解压到一个非中文无空格的目录下。 例如:
OY
2022/03/17
7560
Maven基本知识
直接运行jar包找不到主类和没有主清单属性的解决
在正确编译好java程序之后,打包,然后在命令行输入java -jar ,却弹出没有主清单属性或者找不到或无法加载主类。
来自银河系的员程序
2022/01/24
5.9K0
直接运行jar包找不到主类和没有主清单属性的解决
springBoot导入本地jar并且要求通过maven打包到项目的jar中|Unable to open nested jar file 'BOOT-INF/lib/xxxxxx.jar'
今天做项目的时候,需要用到第三方写的jar包,我们知道,maven项目是在pom.xml文件中,引入jar包的maven地址,这样是可以直接import的,eg
小小鱼儿小小林
2020/06/24
4.7K0
springBoot导入本地jar并且要求通过maven打包到项目的jar中|Unable to open nested jar file 'BOOT-INF/lib/xxxxxx.jar'
相关推荐
Jar 包加密
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验