我想在Ant中调用<proguard>
任务,并需要传递各种JAR文件的路径,例如相当于:
<proguard>
-injars /some/path/jar1;/some other path/jar2
</proguard>
问题在于,这些路径中可能包含空格或特殊字符,必须像proguard手册中所解释的那样进行引用:
<proguard>
-injars /some/path/jar1;"/some other path/jar2"
</proguard>
不能引用整个参数,需要单独引用各自的路径。我正在修改的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
。路径转换会为每个路径调用映射器链。如果正则表达式匹配,就会使用它,否则就使用身份映射器。正则表达式简单地表示,如果我们找到一个没有空格后跟至少一个空格的内容,则用双引号括起来。