Java Ant从(绝对)属性创建文件集、目录集

Java Ant从(绝对)属性创建文件集、目录集,java,ant,Java,Ant,在ant中,我定义了一些属性,这些属性定义了构建系统中需要的一些路径(绝对路径) 大多数ant任务都需要文件集,因此要从属性构建文件集,我必须执行以下操作: <fileset dir="" includes="${myprop}"/> 问题是myprop是绝对的,我应该省略dir属性(这是不可能的),所以有没有办法定义(绝对)属性并有效地使用它们来创建文件集、dirset等。或者在ant中这是一种不好的做法(应该只使用相对路径) 谢谢。我建议您对dir目标使用不同的属性,如果您

在ant中,我定义了一些属性,这些属性定义了构建系统中需要的一些路径(绝对路径

大多数ant任务都需要文件集,因此要从属性构建文件集,我必须执行以下操作:

<fileset dir="" includes="${myprop}"/>

问题是
myprop
是绝对的,我应该省略dir属性(这是不可能的),所以有没有办法定义(绝对)属性并有效地使用它们来创建文件集、dirset等。或者在ant中这是一种不好的做法(应该只使用相对路径)


谢谢。

我建议您对
dir
目标使用不同的属性,如果您对${myprop}进行绝对引用,我猜它是一个文件名。尝试将其分为${parent.dir}和${target.filename}

<fileset dir="${parent.dir}" includes="${target.filename}"/>

关于Ant的绝对值和相对值没有特别的规则。如果可能的话,您应该避免硬编码绝对路径,以使构建更具可移植性。如果必须对构建的某些部分使用绝对路径,请尝试构造它们(比如从项目的
${basedir}
中),以便更容易进行更改

将绝对路径转换为相对路径以便在文件集等中使用时,有两件事可能很有用:

  • 支持可用于从绝对路径转换为相对路径的属性
    relative=

  • 当一个属性中有多个绝对路径时,可以使用
示例:

<!-- Absolute paths -->
<property name="myprop" value="${basedir}/x" />
<property name="myprop2" value="${basedir}/x:${basedir}/y" />

<!-- Convert single path to relative to basedir -->
<property name="myprop_rel" location="${myprop}" relative="yes"/>

<!-- Go via path/pathconvert for the property with multiple paths -->
<path id="mypath2" path="${myprop2}" />
<pathconvert property="myprop2_rel" refid="mypath2" pathsep=",">
    <map from="${basedir}/" to="" />
</pathconvert>

<fileset id="my_fileset" dir="." includes="${myprop2_rel}" />

当一个属性中有多个绝对路径时,是否有方法获得最大的公共连续前缀(这将是basedir)?@alem0lars-您的评论值得提出自己的问题。我添加了一个候选解决方案。
<macrodef name="common-prefix-dir">
  <attribute name="refid" />
  <attribute name="outputproperty" />
  <sequential>
  <script language="javascript"><![CDATA[

    srcFiles = project.getReference( "@{refid}" )
              .getDirectoryScanner( project )
              .getIncludedFiles( );

    if ( srcFiles.length > 0 ) {
      prefix = "" + srcFiles[0];
      for ( i = 0; i < srcFiles.length; i++ ) {
        while ( prefix.length && srcFiles[i].substr( 0, prefix.length ) != prefix ) {
          prefix = prefix.substr( 0, prefix.length - 1);
        }

        if ( !prefix.length ) {
          break;
        }
      }
    }
    else {
      prefix = "";
    }
    prefix = prefix.substring( 0, prefix.lastIndexOf( '/' ) );
    project.setProperty( "@{outputproperty}", prefix );

  ]]></script>
  </sequential>
</macrodef>
<property name="my.dir" location="...your dir here..." />
<fileset id="my.fs" dir="${my.dir}">
  <!-- define fileset here -->
</fileset>
<echo message="Input fileset is: '${toString:my.fs}'" />

<common-prefix-dir refid="my.fs" outputproperty="prefix" />
<echo message="Longest common prefix is: '${prefix}'" />
<pathconvert property="shrink" refid="my.fs" pathsep=",">
  <map from="${my.dir}/${prefix}/" to="" />
</pathconvert>
<fileset id="my.fs.out" dir="${my.dir}/${prefix}" includes="${shrink}" />
<echo message="Shrink-wrapped fileset is: '${toString:my.fs.out}'" />