我想在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>
引用整个论点并不起作用,个别路径需要单独引用。我正在修改的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
。路径转换为每个路径调用映射器链。如果正则表达式匹配,则需要使用该标识符。 regexp简单地说,如果我们找到没有空格的东西,后跟至少有空格的东西,用双引号括起来。
答案 0 :(得分:2)
一种选择是使用'全XML'proguard任务,然后每个jar将是一个单独的元素,但通常用于渲染属性的路径,您将使用Ant pathconvert
task。例如:
<fileset id="some.classpath" dir=".">
...
</fileset>
<pathconvert property="injars.inner" refid="some.classpath" pathsep='"${path.separator}"' />
<property name="injars" value='"${injars.inner}"' />
注意添加前导和尾随双引号 - pathsep
仅适用于路径的元素。
然后按照你提到的方式使用它:
<proguard>
-injars ${injars}
</proguard>