如何在ant任务中正确引用路径?

3

我想在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。路径转换会为每个路径调用映射器链。如果正则表达式匹配,就会使用它,否则就使用身份映射器。正则表达式简单地表示,如果我们找到一个没有空格后跟至少一个空格的内容,则用双引号括起来。
1个回答

2

一种选择是使用“full-XML” proguard任务,然后每个jar文件都是单独的元素,但通常为了将路径渲染到属性中,您将使用Ant的pathconvert任务。例如:

<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
您还可以在<proguard>标签内添加所需的引号:<proguard>-injars "${injars}"</proguard> - Eric Lafortune
谢谢@martin,你的提示非常棒,我最终通过阅读<mapper>文档找到了解决方案。 - ralfoide

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接