读取jar包内部配置文件信息的解析
读取jar文件内部的配置信息是在进行开发基于java程序组件时必然会遇到的问题,这里所遇到的问题是在开发测试和部署(也就是将程序打成jar包之后供其他组件调用)时往往会不一致。也就是开发的时候我们的代码可以访问到配置文件信息,但是一旦打成jar包之后往往会遇到“FileNotFoundException”,也就是无法找到配置文件。下面看一个示例。
这是一个测试项目,项目的结构如图所示,现在需要在Main.java类中读取conf.properties文件中的信息。
不一致行为
如果我们在代码中使用下面的语句
- ...
- String confPath = "src/conf/conf.properties";
- FileInputStream fis = new FileInputStream(new File(confPath));
- config.load(fis);
- ...
那么我们打成jar包之前运行程序是可以读取到所要信息,但是打成jar包之后必然会遇到“FileNotFoundException”。而如果使用下面的代码
- ...
- String confPath = "conf/conf.properties";
- FileInputStream fis = new FileInputStream(new File(confPath));
- config.load(fis);
- ...
那么无论是打包之前还是之后都会遇到“FileNotFoundException”的异常!
正确的做法
- ...
- String confPath = "conf/conf.properties";
- config.load(this.getClass().getClassLoader().getResourceAsStream(confPath));
- ...
这时,无论是在打jar包之前还是之后都可以正确读取conf.properties文件中的信息!
原因分析
上面两种截然不同的结果产生的原因是我们使用的FileInputStream和getResourceAsStream()方法的差异所造成的!所以原因也必然在于FileInputStream和getResourceAsStream()的不同。
根据JDK中的表述,FileInputStream是基于当前JVM所在的OS,在文件系统指定的路径中进行查找要求的资源。而ClassLoader类的getResourceAsStream()方面的描述如下:
public InputStream getResourceAsStream(String name)
public URL getResource(String name)
|
从这段文字表述中我们不难发现,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包内部配置文件信息的解析相关推荐
- 如何读取jar包外的properties和log4j.properties等配置文件
一般在项目中使用properties配置文件的时候都将相关的properties文件放在src目录下,在将该app打包生成jar后,相应的properties配置文件生... 一般在项目中使用prop ...
- Java如何读取JAR包外的properties文件及打成jar包后无法读取到jar包内的properties文件
项目中,经常把一部分功能独立出来,做一个java project,然后打成jar包供其他项目引用.这时候,如果jar包中需要读取配置文件信息,则很少把该配置打进jar包,因为它不方便修改,更多都是采 ...
- 如何读取jar包外的properties文件和log4j.properties
2019独角兽企业重金招聘Python工程师标准>>> 时间有限,不做排版和具体讲述问题产生的过程,下面是我的解决方案,已证实有效,其中Log4jP = "log4j.pr ...
- Spring读取jar包外部的配置文件properties
2019独角兽企业重金招聘Python工程师标准>>> 一 . 如何获取jar包外的文件? 新项目用jar包运行,直接需求就是读取jar外部的配置文件properties,做到不同的 ...
- java jar包 配置文件_java 导入jar包中配置文件
spring项目只能识别到项目内的xml配置文件,无法识别jar中xml配置文件 解决思路: 在启动初始化期间,将jar包内部的文件拷贝到jar包外部相对路径中.//jarFullFileName: ...
- java 打包 配置文件_有关打包成可执行jar包后引用jar包中配置文件问题
一 问题由来 有时候我们做一些项目时,需要将一些配置信息写入配置文件中,以供调用.比如说这样: 如果我们需要在Demo.java中读取config.txt这个文件中的配置信息,在这种工程目录下是可以使 ...
- 打包部署后无法读取jar包里的文件(实测可行,Java中读取jar包中的文件)
打包部署后无法读取jar包里的文件 Java中读取jar包中的文件 linux中无法读取jar包中的内容(windows可以的!),如何解决 一.背景 项目中免不了需要读取文件,如果文件用绝对路径读取 ...
- java原生和SpringBoot读取jar包中MANIFEST.MF的方式
我们经常看到java的一些jar包META-INF目录下包含一个MANIFEST.MF文件,里面包含一些版本信息,标题,实现组织,很多第三方的jar包还会自定义一个属性. 本文讲解如何读取jar包中M ...
- java 如何读取jar包内资源文件_【解惑】深入jar包:从jar包中读取资源文件
我们常常在代码中读取一些资源文件(比如图片,音乐,文本等等).在单独运行的时候这些简单的处理当然不会有问题.但是,如果我们把代码打成一个jar包以后,即使将资源文件一并打包,这些东西也找不出来了.看看 ...
最新文章
- PL/SQL 中Returning Into的用法
- pyhanlp 停用词与用户自定义词典
- mapreduce之partition分区
- Maven内部版本号插件–用法示例
- vslabel隐藏了怎么找_vscode菜单栏与工具栏隐藏之后怎么找回来
- csuoj-1900 锋芒毕露
- python画图时常用的颜色——color=‘ ’
- web前端开发技术(第3版)储九良著课后实验
- pdf、epub、awz3、mobi电子书下载网站推荐!
- 一元函数积分学的计算
- Android实践:基于聚合数据的手机号码归属地查询
- 大型网站技术架构-读后感
- HKEY_CURRENT_USER下在服务中注册自启动exe
- 关于RPC框架封装时ThreadPool的选型和设计
- 淘宝网【附源码-仅学习】
- 2022面试Android之单例模式
- 编程论坛手机客户端 ~太强悍了
- 安卓手机阅读器_【BOOX彩屏】彩色墨水屏阅读器,BOOX Poke2 Color 使用体验
- Python基于Django的电影推荐系统和论坛项目完整源码
- 傲梅分区 哪个好_什么是SCI,SCI期刊,影响因子,SCI分区?