读取jar文件内部的配置信息是在进行开发基于java程序组件时必然会遇到的问题,这里所遇到的问题是在开发测试和部署(也就是将程序打成jar包之后供其他组件调用)时往往会不一致。也就是开发的时候我们的代码可以访问到配置文件信息,但是一旦打成jar包之后往往会遇到“FileNotFoundException”,也就是无法找到配置文件。下面看一个示例。

 
这是一个测试项目,项目的结构如图所示,现在需要在Main.java类中读取conf.properties文件中的信息。

不一致行为
如果我们在代码中使用下面的语句

  1. ...
  2. String confPath = "src/conf/conf.properties";
  3. FileInputStream fis = new FileInputStream(new File(confPath));
  4. config.load(fis);
  5. ...

那么我们打成jar包之前运行程序是可以读取到所要信息,但是打成jar包之后必然会遇到“FileNotFoundException”。而如果使用下面的代码

  1. ...
  2. String confPath = "conf/conf.properties";
  3. FileInputStream fis = new FileInputStream(new File(confPath));
  4. config.load(fis);
  5. ...

那么无论是打包之前还是之后都会遇到“FileNotFoundException”的异常!

正确的做法

  1. ...
  2. String confPath = "conf/conf.properties";
  3. config.load(this.getClass().getClassLoader().getResourceAsStream(confPath));
  4. ...

这时,无论是在打jar包之前还是之后都可以正确读取conf.properties文件中的信息!

原因分析
上面两种截然不同的结果产生的原因是我们使用的FileInputStream和getResourceAsStream()方法的差异所造成的!所以原因也必然在于FileInputStream和getResourceAsStream()的不同。
根据JDK中的表述,FileInputStream是基于当前JVM所在的OS,在文件系统指定的路径中进行查找要求的资源。而ClassLoader类的getResourceAsStream()方面的描述如下:

public InputStream getResourceAsStream(String name)
返回读取指定资源的输入流。

getResource(String) 的文档中描述了搜索顺序。

参数:
name - 资源名称
返回:
用于读取资源的输入流,如果无法找到资源,则返回 null
从以下版本开始:
1.1
public URL getResource(String name)
查找具有给定名称的资源。资源是可以通过类代码以与代码基无关的方式访问的一些数据(图像、声音、文本等)。

资源名称是以 '/' 分隔的标识资源的路径名称。

此方法首先搜索资源的父类加载器;如果父类加载器为 null,则搜索的路径就是虚拟机的内置类加载器的路径。如果搜索失败,则此方法将调用 findResource(String) 来查找资源。

参数:
name - 资源名称
返回:
读取资源的 URL 对象;如果找不到该资源,或者调用者没有足够的权限获取该资源,则返回 null
从以下版本开始:
1.1

从这段文字表述中我们不难发现,getResourceAsStream()在查找资源时跟JVM所用的OS毫无关系,甚至跟资源所在文件系统的路径也是无关的,它是基于类路径进行查找的!也就是说,当jar包或*.class文件加载之后,JVM会根据jar包或*.class文件所在的classpath属性去查找指定的资源,而这个classpath是在jar包的MANIFEST.MF文件中指定的,如下所示:
Manifest-Version: 1.0
Class-Path: .
Main-Class: com.webex.app.Main
这里的“.”代表当前路径,是一个相对路径,但是它相对的是一个“虚拟路径”,也就是jar或*.class文件加载到JVM后的“路径”!

转载于:https://blog.51cto.com/zorro/869765

读取jar包内部配置文件信息的解析相关推荐

  1. 如何读取jar包外的properties和log4j.properties等配置文件

    一般在项目中使用properties配置文件的时候都将相关的properties文件放在src目录下,在将该app打包生成jar后,相应的properties配置文件生... 一般在项目中使用prop ...

  2. Java如何读取JAR包外的properties文件及打成jar包后无法读取到jar包内的properties文件

    项目中,经常把一部分功能独立出来,做一个java  project,然后打成jar包供其他项目引用.这时候,如果jar包中需要读取配置文件信息,则很少把该配置打进jar包,因为它不方便修改,更多都是采 ...

  3. 如何读取jar包外的properties文件和log4j.properties

    2019独角兽企业重金招聘Python工程师标准>>> 时间有限,不做排版和具体讲述问题产生的过程,下面是我的解决方案,已证实有效,其中Log4jP = "log4j.pr ...

  4. Spring读取jar包外部的配置文件properties

    2019独角兽企业重金招聘Python工程师标准>>> 一 . 如何获取jar包外的文件? 新项目用jar包运行,直接需求就是读取jar外部的配置文件properties,做到不同的 ...

  5. java jar包 配置文件_java 导入jar包中配置文件

    spring项目只能识别到项目内的xml配置文件,无法识别jar中xml配置文件 解决思路: 在启动初始化期间,将jar包内部的文件拷贝到jar包外部相对路径中.//jarFullFileName:  ...

  6. java 打包 配置文件_有关打包成可执行jar包后引用jar包中配置文件问题

    一 问题由来 有时候我们做一些项目时,需要将一些配置信息写入配置文件中,以供调用.比如说这样: 如果我们需要在Demo.java中读取config.txt这个文件中的配置信息,在这种工程目录下是可以使 ...

  7. 打包部署后无法读取jar包里的文件(实测可行,Java中读取jar包中的文件)

    打包部署后无法读取jar包里的文件 Java中读取jar包中的文件 linux中无法读取jar包中的内容(windows可以的!),如何解决 一.背景 项目中免不了需要读取文件,如果文件用绝对路径读取 ...

  8. java原生和SpringBoot读取jar包中MANIFEST.MF的方式

    我们经常看到java的一些jar包META-INF目录下包含一个MANIFEST.MF文件,里面包含一些版本信息,标题,实现组织,很多第三方的jar包还会自定义一个属性. 本文讲解如何读取jar包中M ...

  9. java 如何读取jar包内资源文件_【解惑】深入jar包:从jar包中读取资源文件

    我们常常在代码中读取一些资源文件(比如图片,音乐,文本等等).在单独运行的时候这些简单的处理当然不会有问题.但是,如果我们把代码打成一个jar包以后,即使将资源文件一并打包,这些东西也找不出来了.看看 ...

最新文章

  1. PL/SQL 中Returning Into的用法
  2. pyhanlp 停用词与用户自定义词典
  3. mapreduce之partition分区
  4. Maven内部版本号插件–用法示例
  5. vslabel隐藏了怎么找_vscode菜单栏与工具栏隐藏之后怎么找回来
  6. csuoj-1900 锋芒毕露
  7. python画图时常用的颜色——color=‘ ’
  8. web前端开发技术(第3版)储九良著课后实验
  9. pdf、epub、awz3、mobi电子书下载网站推荐!
  10. 一元函数积分学的计算
  11. Android实践:基于聚合数据的手机号码归属地查询
  12. 大型网站技术架构-读后感
  13. HKEY_CURRENT_USER下在服务中注册自启动exe
  14. 关于RPC框架封装时ThreadPool的选型和设计
  15. 淘宝网【附源码-仅学习】
  16. 2022面试Android之单例模式
  17. 编程论坛手机客户端 ~太强悍了
  18. 安卓手机阅读器_【BOOX彩屏】彩色墨水屏阅读器,BOOX Poke2 Color 使用体验
  19. Python基于Django的电影推荐系统和论坛项目完整源码
  20. 傲梅分区 哪个好_什么是SCI,SCI期刊,影响因子,SCI分区?

热门文章

  1. 【阿里云课程】深度学习模型设计:卷积核的设计与优化
  2. 【AI白身境】深度学习中的数据可视化
  3. 全球及中国磁性分离滑轮行业竞争战略及未来产销需求预测报告2022版
  4. 个性化服务谋定移动电子商务-李玉庭:经信研究重整购物
  5. Kubernetes网络方案Flannel的学习笔记
  6. BZOJ2299 HAOI2011向量(数论)
  7. 利用Nginx做负载均衡
  8. 关于迷笛音乐节的重大通知-_-
  9. 线上分享 | 浅谈中台对产品经理的价值
  10. 前众信旅游B端产品经理吴彪:如何搭建B端电商产品及用户体系