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

如何在ant任务中正确引用路径?,ant,quotes,proguard,Ant,Quotes,Proguard,我想在Ant中调用任务,并需要将路径传递给各种JAR文件,例如,等效于: <proguard> -injars /some/path/jar1;/some other path/jar2 </proguard> -injars/some/path/jar1/其他一些路径/jar2 问题是,这些路径中的一些可能包含空格或特殊字符,它们必须这样引用,如中所述: -injars/some/path/jar1;“/其他路径/jar2” 引用整个参数不起作用,需要单

我想在Ant中调用
任务,并需要将路径传递给各种JAR文件,例如,等效于:

<proguard>
   -injars /some/path/jar1;/some other path/jar2
</proguard>

-injars/some/path/jar1/其他一些路径/jar2
问题是,这些路径中的一些可能包含空格或特殊字符,它们必须这样引用,如中所述:


-injars/some/path/jar1;“/其他路径/jar2”
引用整个参数不起作用,需要单独引用各个路径。我正在修改的ant文件使用属性将各种JAR路径传递给proguard,我的问题是如何正确引用-injar和-libraryJAR的各个路径。例如:

<property name="libraryjars" refid="some.classpath" />
<proguard>
   @${proguard.config}
   -libraryjars  ${libraryjars}
</proguard>

@${proguard.config}
-libraryjars${libraryjars}
我刚刚修改了属性,使其看起来像:

<property name="libraryjars.unquoted" refid="some.classpath"/>
<property name="libraryjars" value="'${libraryjars.unquoted}'"/>

但那还是很脆弱,不是吗?有更好的办法吗?如果我有一个带有“path1;path2”的属性,那么我想拆分路径组件,分别引用它们,然后重新创建属性。我知道如何在shell脚本中做到这一点,但ant语法对我来说更神秘:-)哦,当然它需要在所有平台上工作(至少在Windows、Mac和Linux上),处理路径分隔符更改的事实,但这没关系,ant脚本中有一个常量

[更新]感谢@martin的回答,我找到了一个完美的方法,可以用一个内置的



这将转换
C:\path\jar 1;C:\my path\jar2;C:\path\jar3
转换为
“C:\path\jar1”;“C:\my path\jar2”;C:\path\jar3
。路径转换为每个路径调用映射器链。如果regexp匹配,则接受该值,否则接受标识。regexp只是简单地说,如果我们发现一个没有空格的东西后跟一个至少有空格的东西,用双引号将其括起来。

一个选项是使用“完整XML”proguard任务,那么每个jar将是一个单独的元素,但一般来说,为了呈现属性的路径,您将使用Ant。例如:

<fileset id="some.classpath" dir=".">
    ...
</fileset>

<pathconvert property="injars.inner" refid="some.classpath" pathsep='"${path.separator}"' />
<property name="injars" value='"${injars.inner}"' />

您还可以在标记中添加所需的引号:-injars“${injars}”谢谢@martin。这是一个完美的指针,我最终通过阅读
文档找到了解决方案。
<pathconvert property="dest.path" refid="source.path">
  <firstmatchmapper>
    <regexpmapper from='^([^ ]*)( .*)$$' to='"\1\2"'/>
    <identitymapper/>
  </firstmatchmapper>
</pathconvert>
<fileset id="some.classpath" dir=".">
    ...
</fileset>

<pathconvert property="injars.inner" refid="some.classpath" pathsep='"${path.separator}"' />
<property name="injars" value='"${injars.inner}"' />
<proguard>
  -injars ${injars}
</proguard>