其他
拒绝 FileNotFoundException!总结了这几个读取 jar 包外配置文件的知识点
The following article is from 侠梦的开发笔记 Author 侠梦
(给ImportNew加星标,提高Java技能)
转自:公众号 侠梦的开发笔记 作者:侠梦
mp.weixin.qq.com/s/Dp0vZdRxESNraJlFMnQ4gA
前言
初识getResource
案例一
FieldMapConfig.class.getResource("p1.properties").getPath();
这段代码在本地运行没有任何问题,一放到线上就报空指针。
案例二
读取配置,报错FileNotFoundException。 乍一看,两段代码好像没有什么区别,但是细心的你,应该发现:
App.class.getClassLoader().getResource("p1.properties").getPath();
FieldMapConfig.class.getResource("p1.properties")
一个使用当前class的api,一个使用的当前class的classLoader的api来获取的,这有什么区别呢?请听我细细分说。
Class和ClassLoader
秉着探索的态度,我写了一个例子,请看:
public static void main( String[] args ) {
if (args.length != 1) {
System.out.println("usage: java -jar com.hyq.simple-1.0.jar args");
return;
}
System.out.println("App.class.getResource(args[0]):");
System.out.println(App.class.getResource(args[0]));
System.out.println();
System.out.println("App.class.getClassLoader().getResource(args[0]):");
System.out.println(App.class.getClassLoader().getResource(args[0]));
System.out.println();
System.out.println("App.class.getResourceAsStream(args[0]):");
System.out.println(App.class.getResourceAsStream(args[0]));
System.out.println();
System.out.println("App.class.getClassLoader().getResourceAsStream(args[0]):");
System.out.println(App.class.getClassLoader().getResourceAsStream(args[0]));
System.out.println();
}
从上图可以看出,使用当前类的GetResource和当前类的classloader的getResource, 获取到的配置有区别。怎么解释呢?
各种路径试验
如果你还在为相对路径,配置文件前面带不带/,等一系列问题折腾,那不如动手做做试验看看,代码还是上面那段代码,通过动态传入配置文件的路径来读取,试验结果如下:
为什么推荐使用getResourceAsStream?
形如:"jar:file:/data/simpleJava/com.hyq.simple-1.0.jar !/p1.properties" 这样的路径,getResource是无法读取的,因为他不是一个文件路径。而getResourceAsStream会以流的方式,打开文件来读取数据,上图的文件树,就是我用unzip命令解压jar包后显示出来的。
springboot加载配置
1、当前jar包所在目录的config目录下。 2、当前目录。 3、jar包内classpath的config目录。 4、jar包内classpath目录。
通过名字动态加载配置?
知识点一
boot配置的语法是,凡是以--开头(两个横线)的配置,会被解析。相信大家可能遇到过这样一个场景,同一个jar包要启动多次,每个进程的配置不一样,端口不同。
知识点二
java -Dspring.application.json='{"name":"test"}' -jar myapp.jar
知识点三
java -jar myproject.jar
--spring.config.location
=classpath:/p1.properties,classpath:/p2.properties
spring:
profiles:
active: prod
知识点五
@Value("${app.init.welcome-msg:侠梦的开发笔记}")
private String msg;
总结
本章节我们做了实验,了解了getResource和getResourceAsStream的区别。 学习了springboot通过动态指定配置名,读取配置。 指定读取多个配置文件。 不同运行环境获取不同配置的方式。
看完本文有收获?请转发分享给更多人
关注「ImportNew」,提升Java技能
好文章,我在看❤️