问题来源
最近新建立的Maven工程,其中用到了证书,刚开始编译启动都正常。 为了在构建项目生成docker镜像时能使用项目名称和版本构建时间等信息,在项目bootstrap.propertes文件添加了如下变量
info.build.artifactId=@project.artifactId@
info.build.version=@project.version@-@buildTime@
结果生成的target目录下bootstrap.properties文件确实完成了变量替换
#info
info.build.artifactId=myproject-service
info.build.version=2.6.0-20190412-225204
但是使用证书部分的代码却开始报错Invalid keystore format, URI: classpath://certs/xxxx.jks, type: JKS
问题分析
回想起来刚才一切都正确, 唯一的变动就是在bootstrap.properties中添加了变量然后修改了pom文件. 于是开始怀疑是否因为过滤替换导致了问题
<resources>
<resource>
<!-- 指定打包时,需要特殊处理的文件 -->
<directory>src/main/resources</directory>
<!-- 处理文件时,需要对文件进行变量替换 -->
<filtering>true</filtering>
</resource>
</resources>
简单对比了src/main/resources/certs目录下的JKS证书和 target\classes\certs下的JKS证书文件,果然是这样的。
解决办法
我们在第二步中找到了问题原因,那就好解决了。
第一不使用过滤替换,这个办法简单粗暴。会导致我们没法使用bootstrap.properties中的变量。
第二种,就是细粒度地控制过滤替换功能,证书文件不进行过滤替换。
<resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*</include>
</includes>
</resource>
<resource>
<directory>src/main/resources</directory>
<excludes>
<exclude>certs/*</exclude>
</excludes>
<filtering>true</filtering>
</resource>
</resources>
我们先指定定 src/main/resources下所有文件及文件夹为资源文件,然后在过滤时将src/main/resources/certs/*排除在外。
官方link
0, 关于资源 http://maven.apache.org/plugins/maven-resources-plugin/examples/resource-directory.html
如果我们的证书不在src/main/resources/certs/目录下面,我们可以添加
<resource>
<directory>src/myresources</directory>
<includes>
<include>**/*</include>
</includes>
</resource>
1, 关于过滤 http://maven.apache.org/plugins/maven-resources-plugin/examples/filter.html