- 前言
- 一、maven
标签使用 - 二、maven打包资源文件踩坑记录
- 1.背景
- 2.坑点
- 3.解决办法
- 总结
前言 springboot工程中,会有需要将一些资源文件例如excel,xml等配置文件放到resource目录下,方便代码中进行读取,而使用maven打包时,可通过resource标签来配置资源文件是否需要被打入jar包,以及文件中的占位符是否需要过滤
一、maven
转载 https://www.cnblogs.com/luweiweicode/p/14282017.html
二、maven打包资源文件踩坑记录 1.背景在springboot项目中,需要调用外部系统接口,而接口采用https方式访问,所以需要将目标url的https证书加载到项目中。本项目中,将证书cer文件放到工程的resource目录下,如图:
至于如何将证书加载到jdk中,以及如何生成证书和代码中使用证书,这里不再赘述,网上很多方法,可参考以下链接:
https://blog.csdn.net/fengbird/article/details/89462295
当我愉快地启动工程运行时,发现系统无法加载xx.keystore文件,提示
Invalid keystore format
显然,keystore文件有问题,网上搜了一番,有人提出生成keystore文件使用的java版本必须和工程运行的java版本保持一致,这是个需要注意的地方,但本人的问题并不是这个。
然后又看到有人说是因为maven打包的将资源文件修改所导致,故我将keystore文件放到工程外部,通过文件读取方式加载,果然问题就解决了。
通过对比可以发下,打包后的keystore文件大小竟然和打包前keystore文件大小不一致!说明打包的时候将keystore文件修改了,所以程序加载的时候当然要报错了!
虽然解决了燃眉之急,但是把文件放在外部,引用始终存在不方便,如果部署到多个服务器岂不是要上传多次文件,配置不同的路径。为了彻底解决这个问题,就需要研究maven的打包方式
3.解决办法
先抛出正确的maven配置:
这里重点说下filtering ,include和exclude三个标签的用法,看了网上很多资料,都说的不是很全面或者模棱两可。
首先,filtering为true表示开启过滤,表示maven打包时会替换资源文件中的占位符,比如我们常用的application.yml中的@spring.active@ 环境变量占位符就会被替换成真实变量。如果filtering为false,表示关闭过滤,表示不对文件进行占位符替换。
重点来了!
上图中,第一个resource标签中,如果不配置includes和excludes,表示所有文件都会被过滤且打包到classpath下。而配置了
但也不会将文件打包到classpath下。所以,如果不写第二个resource标签,则xx.keystore文件就不会出现在打包文件中!
如果只写第二个配置会怎么样呢,也不行,第二个配置关闭了过滤,且只打包keys目录,意味着其他的例如application.yml不会被替换占位符也不会被打包,显然不对。
第二个resource标签filtering为false,表示不需要过滤但是需要打包,对哪些不过滤但是要打包呢,使用
所以,综合两个配置,第一个配置 keys目录不过滤也不打包,第二个配置 keys目录不过滤但要打包,得出keys目录不过滤但要打包。
这几个标签理解起来比较绕,大概就是这个意思,如果你想排除某些资源文件不被过滤,就得配合两个resource标签一起使用
1.如果遇到证书在代码里加载错误,主要考虑两点,一是否采用同样的java版本生成证书和运行工程,二是如果使用了maven打包,是否被maven进行过滤导致文件被修改;
2.springboot中经常会有将资源文件或者其他配置文件放到resources目录下供代码内部引用,有时候莫名其妙遇到文件打不开或者打开错误,都有可能是maven打包过滤的问题。在实际开发中,遇到过将excel模板文件放入resources目录下,没有排除maven打包过滤,导致打包时被修改,文件无法读取的情况时常发生,故写下此篇博客记录,防止后续继续踩坑。