2011-05-10 77 views
3

我想在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)上工作,处理事实路径分隔符的变化,但这是好的在蚂蚁脚本中有一个常量。

[更新]感谢@马丁的回答,我找到了完美的方式做正是我想要使用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。路径转换为每个路径调用映射链。如果正则表达式匹配,则需要该身份。正则表达式只是说如果我们发现一些没有空格的东西,然后至少有一个空格,用双引号括起来。

回答

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> 
+2

您还可以添加所需的引号标签内: -injars“$ {} injars” 2011-05-11 19:39:04

+0

感谢@马丁。这是一个完美的指针,我通过阅读''文档找到了解决方案。 – ralfoide 2011-05-12 22:21:07