如何在Maven的process-resources阶段基于资源文件生成${builtinLocales}变量?
实现方案:Maven构建时生成内置语言列表变量
可以通过Maven Antrun插件结合Ant的文件处理能力实现需求,在process-resources阶段自动扫描资源文件并生成目标变量,具体步骤如下:
1. 在pom.xml中配置Antrun插件
绑定插件到process-resources阶段,编写Ant任务完成文件扫描、提取和属性设置:
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-antrun-plugin</artifactId> <version>3.1.0</version> <executions> <execution> <id>generate-builtin-locales</id> <phase>process-resources</phase> <goals> <goal>run</goal> </goals> <configuration> <target> <!-- 扫描resources目录下匹配labels_*.properties的文件 --> <fileset id="localeFiles" dir="${project.basedir}/src/main/resources"> <include name="labels_*.properties"/> </fileset> <!-- 提取语言标识(如en、de)并拼接成分号分隔的字符串 --> <pathconvert property="builtinLocales" pathsep=";"> <map from="${project.basedir}/src/main/resources/labels_" to=""/> <map from=".properties" to=""/> <fileset refid="localeFiles"/> </pathconvert> <!-- 如果需要提取完整前缀(如labels_en、labels_de),替换上面的pathconvert为以下配置 --> <!-- <pathconvert property="builtinLocales" pathsep=";"> <map from="${project.basedir}/src/main/resources/" to=""/> <map from=".properties" to=""/> <fileset refid="localeFiles"/> </pathconvert> --> <!-- 将属性传递给Maven --> <property name="maven.builtinLocales" value="${builtinLocales}"/> </target> </configuration> </execution> </executions> </plugin> <!-- 启用资源过滤,让配置文件能引用生成的属性 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-resources-plugin</artifactId> <version>3.3.1</version> <configuration> <filtering>true</filtering> <resources> <resource> <directory>src/main/resources</directory> <!-- 只对需要替换属性的配置文件开启过滤,避免影响其他资源 --> <includes> <include>application.properties</include> </includes> </resource> <resource> <directory>src/main/resources</directory> <excludes> <exclude>application.properties</exclude> </excludes> </resource> </resources> </configuration> </plugin> </plugins> </build>
2. 在配置文件中引用生成的属性
比如在src/main/resources/application.properties中添加:
# 可用语言列表 app.available.locales=${builtinLocales}
3. 验证效果
执行mvn process-resources后,查看target/classes/application.properties,会发现app.available.locales已经被替换为扫描到的语言列表(如en;de或labels_en;labels_de)。
关键说明
- Ant的
pathconvert任务负责将文件路径转换为目标字符串,通过map规则去掉不需要的前缀和后缀。 - 启用资源过滤时,建议只对需要替换属性的文件开启,防止其他资源文件(如图片、静态文件)被意外修改。
- 插件版本可以根据自己的Maven环境调整,确保兼容性。
内容的提问来源于stack exchange,提问作者lvr123
相关产品推荐
相关产品推荐

