Maven在使用SpringBoot部署https服务时,启动时加载KeyStore出现了错误:Invalid keystore format(Maven官方提供的解决方案)。(maven配置spring)(maven springframework)

访客 115 0

一、前言

最近,在本地部署https服务时遇到了一个问题。在成功创建了keystore签名文件并完成了所有配置工作后,启动过程中却出现了错误:Invalid keystore format。经过多次确认,确认KeyStore签名文件格式本身没有问题。接下来,我将与大家分享该问题的根源以及解决方法。

Maven在使用SpringBoot部署https服务时,启动时加载KeyStore出现了错误:Invalid keystore format(Maven官方提供的解决方案)。(maven配置spring)(maven springframework)-第1张图片-谷歌商店上架

二、根因分析

1、基本原因

当遇到疑难杂症时,使用Google是一个很好的习惯(请不要问我为什么不用其他搜索引擎)。经过一番搜索之后,我终于找到了与我相同问题的人,并且在以下链接中找到了解决方案:https://stackoverflow.com/questions/57541107/keystore-load-fails-with-invalid-keystore-format。

Maven在使用SpringBoot部署https服务时,启动时加载KeyStore出现了错误:Invalid keystore format(Maven官方提供的解决方案)。(maven配置spring)(maven springframework)-第2张图片-谷歌商店上架

终于,在该问题的后续中找到了答案(如下所示)。简而言之,JKS(KeyStore)文件被Maven Resources插件渗透,这将导致文件损坏。此外,还提及了一些关于该问题的统一描述。

Maven在使用SpringBoot部署https服务时,启动时加载KeyStore出现了错误:Invalid keystore format(Maven官方提供的解决方案)。(maven配置spring)(maven springframework)-第3张图片-谷歌商店上架

我根据指引也查看了Maven官方描述(地址:https://maven.apache.org/plugins/maven-resources-plugin/examples/filter.html),其中明确提到了通过警告的方式告知我们,过滤器不能应用于二进制文件中,否则会导致文件损坏。同时,官方还给出了解决该问题的方法。

Maven在使用SpringBoot部署https服务时,启动时加载KeyStore出现了错误:Invalid keystore format(Maven官方提供的解决方案)。(maven配置spring)(maven springframework)-第4张图片-谷歌商店上架

2、根因分析

经过以上分析,我们得知这个错误是由于Maven Resources插件的filter属性引起的。那么为什么这个属性会导致二进制文件损坏呢?接下来,我们将进行深入分析。

首先,我们需要了解filter的功能是什么。根据官方说明(如下图所示),我们知道filter的作用是将被过滤器处理的文件中的${}占位符替换为命令行或者pom中的属性值。

Maven在使用SpringBoot部署https服务时,启动时加载KeyStore出现了错误:Invalid keystore format(Maven官方提供的解决方案)。(maven配置spring)(maven springframework)-第5张图片-谷歌商店上架

为了完成整个占位符替换的操作,Maven Resources插件会将所有需要进行过滤的文件都视为文本文件进行读取,并查找${}占位符并进行替换。在完成占位符替换后,再将修改后的内容重新写回文件中。这个过程会导致文件被重新写入,并且格式似乎会被重写为UTF-8编码。因此,即使二进制文件没有占位符,但由于重新写入时修改了字符编码,仍然可能导致文件损坏。

三、解决办法

一旦我们了解了问题的原因,就能更好地处理它。目前,我们有两种主要的处理方式:

1、二进制资源单独存放一个Resouces文件夹(官方推荐)

Maven官方推荐的方法可以在以下地址找到:https://maven.apache.org/plugins/maven-resources-plugin/examples/filter.html

将二进制文件单独存放到一个名为Resources的文件夹中,这样在使用Maven资源插件时可以对不同的文件夹进行个别处理(二进制文件夹下的资源不会执行过滤)。

Maven在使用SpringBoot部署https服务时,启动时加载KeyStore出现了错误:Invalid keystore format(Maven官方提供的解决方案)。(maven配置spring)(maven springframework)-第6张图片-谷歌商店上架

2、使用exclude过滤不需要filter的文件

这种方法比较粗暴,直接在resource下使用exclude和include来隔离不同的文件,从而对不同的文件采取不同的filter策略。

Maven在使用SpringBoot部署https服务时,启动时加载KeyStore出现了错误:Invalid keystore format(Maven官方提供的解决方案)。(maven配置spring)(maven springframework)-第7张图片-谷歌商店上架

3、两种方式对比

官方推荐的做法是一劳永逸,只需将后续新增的二级机制文件直接放入相应的文件夹中。然而,这需要两个resource文件夹来完成。

使用exclude方式:无需添加新的resource文件夹,但是在后续新增二级机制文件时需要修改pom中的resource插件配置。

PS:通过上述分析我们知道该问题是由Maven Resouces插件的filter导致的,和是否使用Spring Boot并无关系

四、惯例

如果您对本文有任何疑问或者建议,欢迎添加公众号lifeofcoder一起交流探讨(添加公众号可获取楼主最新博文推送以及“Java高级架构”上10G视频和图文资料哦)。

Maven在使用SpringBoot部署https服务时,启动时加载KeyStore出现了错误:Invalid keystore format(Maven官方提供的解决方案)。(maven配置spring)(maven springframework)-第8张图片-谷歌商店上架

 

 

标签: 谷歌商店上架 官方 错误

发表评论 (已有0条评论)

还木有评论哦,快来抢沙发吧~