问题来源

最近新建立的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

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐