【发布时间】:2011-08-22 18:52:26
【问题描述】:
我想在 Ant 中调用 <proguard> 任务并需要将路径传递给各种 JAR 文件,例如相当于:
<proguard>
-injars /some/path/jar1;/some other path/jar2
</proguard>
问题是,其中一些路径可能包含空格或特殊字符,它们必须像 proguard manual 中解释的那样被引用:
<proguard>
-injars /some/path/jar1;"/some other path/jar2"
</proguard>
引用整个参数是行不通的,individual 路径需要单独引用。我正在修改的 ant 文件使用属性将各种 JAR 路径传递给 proguard,我的问题是如何正确引用 -injars 和 -libraryjars 的各个路径。示例:
<property name="libraryjars" refid="some.classpath" />
<proguard>
@${proguard.config}
-libraryjars ${libraryjars}
</proguard>
我刚刚将属性修改为如下所示:
<property name="libraryjars.unquoted" refid="some.classpath"/>
<property name="libraryjars" value="'${libraryjars.unquoted}'"/>
但这仍然很脆弱,不是吗?有没有更好的办法?我有一个带有“path1;path2”的属性,我想拆分路径组件,分别引用它们并重新创建属性。我知道如何在 shell 脚本中做到这一点,但 ant 语法对我来说更加神秘 :-) 哦,当然它需要在所有平台上工作(至少 Windows、Mac 和 Linux),处理事实路径分隔符发生了变化,但没关系,在 ant 脚本中的某处有一个常量。
[更新] 感谢@martin 的回答,我找到了完美的方式来使用pathconvert 和内部mapper chain 来做我想做的事:
<pathconvert property="dest.path" refid="source.path">
<firstmatchmapper>
<regexpmapper from='^([^ ]*)( .*)$$' to='"\1\2"'/>
<identitymapper/>
</firstmatchmapper>
</pathconvert>
这会将C:\path\jar 1;C:\my path\jar2;C:\path\jar3 转换为"C:\path\jar 1";"C:\my path\jar2";C:\path\jar3。路径转换为每个路径调用映射器链。如果正则表达式匹配,则需要它,否则它需要标识。正则表达式只是说,如果我们发现一个没有空格的东西后面跟着一个至少有一个空格的东西,用双引号括起来。
【问题讨论】: