如何通过Maven资源过滤仅在本地默认Profile包含jks资源
问题根因
当前配置失效的核心原因是:写在<build>全局作用域下的<resources>规则对所有Profile生效,第一个<resource>块没有做Profile维度的条件判断,无论激活哪个环境都会把retruststore.jks复制到输出目录;第二个块配置的*.jks排除规则仅作用于自身的资源扫描范围,不会影响第一个块的包含逻辑。
正确配置方案
核心思路是:将jks证书的资源包含规则从全局配置移到default Profile内部,仅当默认Profile激活时才扫描复制证书文件,全局配置只保留所有环境通用的资源规则。
第一步:调整全局build的资源规则
全局配置只保留所有环境都需要的公共资源,不要包含jks文件:
<build> <resources> <!-- 公共基础配置,所有环境都需要 --> <resource> <directory>src/main/resources</directory> <filtering>false</filtering> <includes> <include>application.yaml</include> </includes> </resource> <!-- 对应环境的配置文件,开启变量替换 --> <resource> <directory>src/main/resources</directory> <filtering>true</filtering> <includes> <include>application-${active.profile}.yaml</include> </includes> </resource> </resources> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-resources-plugin</artifactId> </plugin> </plugins> </build>
第二步:在default Profile中追加专属资源规则
仅当default Profile激活时,才将jks证书加入资源扫描范围,注意jks是二进制文件,必须关闭过滤避免文件损坏:
<profiles> <profile> <id>default</id> <properties> <active.profile/> </properties> <activation> <activeByDefault>true</activeByDefault> </activation> <!-- 仅本地构建生效的专属资源配置 --> <build> <resources> <resource> <directory>src/main/resources</directory> <filtering>false</filtering> <includes> <include>retruststore.jks</include> </includes> </resource> </resources> </build> </profile> <profile> <id>dev</id> <properties> <active.profile>dev</active.profile> </properties> </profile> <profile> <id>uat</id> <properties> <active.profile>uat</active.profile> </properties> </profile> <!-- 其余环境Profile保持原有配置不变 --> </profiles>
验证结果
- 执行
mvn compile或IDE默认构建(激活default Profile):输出目录包含application.yaml、retruststore.jks,符合本地开发使用需求 - 执行
mvn compile -P dev/mvn package -P uat/mvn package -P prod等非默认环境构建命令:输出目录仅包含application.yaml和对应环境的application-{env}.yaml,不会携带jks证书,满足云平台部署规则
注意:jks属于二进制证书文件,绝对不能开启
filtering=true的资源过滤,否则Maven会将其作为文本文件替换占位符,直接导致证书损坏无法使用。
内容的提问来源于stack exchange,提问作者bill0871
相关产品推荐
相关产品推荐

