SpringBoot打包时能否将application.properties属性替换到resources资源文件
结论
该需求完全可以实现,默认替换不生效是因为Maven默认没有开启JSON、XML等格式资源文件的占位符过滤,补充对应构建配置即可达到预期效果。
具体配置步骤
1. 开启资源目录的过滤规则
在项目pom.xml的<build>节点下添加资源配置,指定需要做占位符替换的文件类型,同时排除二进制文件避免被损坏:
<build> <resources> <!-- 开启指定类型文本资源的占位符替换 --> <resource> <directory>src/main/resources</directory> <filtering>true</filtering> <includes> <include>**/*.properties</include> <include>**/*.json</include> <include>**/*.xml</include> <include>**/*.yml</include> <include>**/*.yaml</include> </includes> </resource> <!-- 其余资源不做过滤,避免二进制文件被破坏 --> <resource> <directory>src/main/resources</directory> <filtering>false</filtering> <excludes> <exclude>**/*.properties</exclude> <exclude>**/*.json</exclude> <exclude>**/*.xml</exclude> <exclude>**/*.yml</exclude> <exclude>**/*.yaml</exclude> </excludes> </resource> </resources>
2. 加载application.properties中的属性供构建阶段使用
因为你定义的propA.url是写在application.properties中,不是直接定义在pom.xml的属性节点里,需要添加插件让Maven在构建初始化阶段读取该文件的属性值:
<plugins> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>properties-maven-plugin</artifactId> <version>1.2.1</version> <executions> <execution> <phase>initialize</phase> <goals> <goal>read-project-properties</goal> </goals> <configuration> <files> <file>src/main/resources/application.properties</file> </files> </configuration> </execution> </executions> </plugin> </plugins> </build>
注意事项
- 如果项目中resources目录下存放了图片、字体、二进制证书等文件,必须按上述配置把这类文件排除在过滤范围外,否则构建过程会把二进制文件当文本处理,导致文件损坏无法使用
- 如果担心
${}格式的占位符和Spring运行时的占位符规则冲突,可以自定义构建阶段的占位符分隔符,比如改成@属性名@格式,添加如下配置即可:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-resources-plugin</artifactId> <configuration> <delimiters> <delimiter>@</delimiter> </delimiters> <useDefaultDelimiters>false</useDefaultDelimiters> </configuration> </plugin>
调整后资源文件里的占位符对应写成"url": "@propA.url@"即可。
配置完成后执行mvn clean package命令构建,查看target/classes目录下对应的JSON文件,就能看到占位符已经被替换为http://localhost,符合预期效果。
内容的提问来源于stack exchange,提问作者AntonBoarf
相关产品推荐
相关产品推荐

