Maven单Profile中能否一步完成properties键值替换与文件过滤
结论
maven-antrun-plugin 完全支持在单个 Profile 内单步完成占位符替换、按键过滤两项操作,不会生成冗余的中间文件,也可直接输出适配多环境的多份最终配置文件。
执行时生成两个冗余文件的核心原因是 antrun 复制过滤任务未开启覆盖配置、输出路径未做合并处理,直接操作 target 目录下的构建期文件即可规避该问题。
具体实现配置
将如下配置写入对应 Profile 的构建节点中,绑定到资源处理阶段执行即可:
<profile> <id>myApp</id> <properties> <app.title>App1</app.title> <app.title.dev1>App1</app.title.dev1> </properties> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-antrun-plugin</artifactId> <version>3.1.0</version> <executions> <execution> <phase>process-resources</phase> <goals> <goal>run</goal> </goals> <configuration> <target> <!-- 处理target目录下已拷贝的配置文件,临时文件中转避免读写冲突 --> <copy file="${project.build.outputDirectory}/some.properties" tofile="${project.build.outputDirectory}/some.properties.tmp" overwrite="true"> <!-- 替换@...@格式的占位符 --> <filterset begintoken="@" endtoken="@"> <filter token="app.title" value="${app.title}"/> <filter token="app.title.dev1" value="${app.title.dev1}"/> </filterset> <!-- 按规则过滤不需要的配置键行 --> <filterchain> <linecontains negate="true"> <contains value=".dev1"/> </linecontains> </filterchain> </copy> <!-- 覆盖原文件,清理临时文件 --> <move file="${project.build.outputDirectory}/some.properties.tmp" tofile="${project.build.outputDirectory}/some.properties" overwrite="true"/> <!-- 如需生成多环境配置文件,追加对应copy任务即可,示例为生成dev1环境副本 --> <copy file="${project.build.outputDirectory}/some.properties" tofile="${project.build.outputDirectory}/some-dev1.properties" overwrite="true"> <filterset begintoken="@" endtoken="@"> <filter token="app.title" value="${app.title.dev1}"/> </filterset> </copy> </target> </configuration> </execution> </executions> </plugin> </plugins> </build> </profile>
配置说明
- 执行阶段绑定为
process-resources,此时源配置文件已经被Maven拷贝到target输出目录,不会修改源码目录下的原始文件 - 所有copy、move操作都配置
overwrite="true",不会生成名称异常的冗余副本 filterset负责完成@占位符@格式的键值替换,匹配规则和原有替换逻辑完全一致filterchain通过linecontains标签实现键过滤,配置negate="true"时会剔除所有匹配规则的行,示例中会自动删除所有带.dev1后缀的配置键;如果需要更复杂的匹配规则,可以替换为containsregex标签用正则做匹配- 多环境配置只需要在同一个target节点下追加copy任务,分别指定输出文件名、替换规则、占位符取值,单次构建即可生成所有环境对应的配置文件,不需要拆分多个Profile。
内容的提问来源于stack exchange,提问作者Akzylus
相关产品推荐
相关产品推荐

