如何在Maven POM属性中嵌入空格以用于资源过滤及子项目
问题:如何在Maven POM属性中嵌入空格字符用于资源过滤及跨POM使用
背景
项目基于Maven,需在大量文本文件中执行字符串替换,子项目也需完成相同操作。目前采用的方案是在源码树中使用过滤资源文件,同时在顶层聚合POM中配置通用属性供子项目复用。这套方案整体有效,但处理带前置空格的字符串时,Maven 3会自动移除空格,导致功能异常。
当前配置
顶层POM中定义了默认值为空的foo属性及相关变体:
<properties> <foo></foo> <foo.withCommaDelimiters></foo.withCommaDelimiters> <foo.withSpace></foo.withSpace> ..... </properties>
foo可通过命令行-Dfoo=somestring指定值。通过Profile实现条件属性配置:
<profile> <id>all-the-myriad-ways-of-spelling-foo</id> <activation> <property> <!-- 仅判断foo是否被设置,不校验具体值 --> <name>foo</name> </property> </activation> <properties> <foo.withCommaDelimiters>,${foo},</foo.withCommaDelimiters> <foo.withSpace> ${foo}</foo.withSpace> ...以此类推... </properties> </profile>
需求
${foo.*}属性需能在其他POM和过滤资源文件中正常使用:
- 默认构建时,所有
foo.*均为空字符串; - 当通过
mvn -Dfoo=whatever install构建时,自动处理分隔符和格式。
现有POM中有类似属性:
<maybe.involving.foo>${some_string}/stuff${foo}</maybe.involving.foo>
目标是在固定字符串与可选的${foo}之间添加空格,但直接加空格会在foo为空时导致属性末尾残留空格(引发路径等问题),因此新增foo.withSpace属性。
问题核心
Maven会自动移除Profile中foo.withSpace值开头的空格:
<foo.withSpace> ${foo}</foo.withSpace> <!-- 实际效果等同于${foo} -->
已尝试以下无效方案:
- 反斜杠转义:
<foo.withSpace>\ ${foo}</foo.withSpace>会保留反斜杠,Windows环境下反斜杠还会被加倍; - Unicode转义序列:
<foo.withSpace>\u0200${foo}</foo.withSpace>会直接保留\u0200字符串; - CDATA片段:
<foo.withSpace><![CDATA[ ]]>${foo}</foo.withSpace>无效果; xml:space="preserve":仅在<configuration>块生效,对<properties>块不起作用。
曾尝试查看Maven源码,但未找到解决方向,相关XML解析项目的链接也已失效。
内容的提问来源于stack exchange,提问作者Ti Strga
相关产品推荐
相关产品推荐

