如何从Ant中的引用路径中排除文件?

Hen*_*ann 7 ant

在一个项目中,我们有几个源路径,因此我们为它们定义了一个参考路径:

<path id="de.his.path.srcpath">
    <pathelement path="${de.his.dir.src.qis.java}"/>
    <pathelement path="${de.his.dir.src.h1.java}"/>
    ...
</path>
Run Code Online (Sandbox Code Playgroud)

使用该引用在<javac>标记中正常工作:

<src refid="de.his.path.srcpath" />
Run Code Online (Sandbox Code Playgroud)

在下一步中,我们必须将非java文件复制到classpath文件夹:

<copy todir="${de.his.dir.bin.classes}" overwrite="true">
    <fileset refid="de.his.path.srcpath">
       <exclude name="**/*.java" />
    </fileset>
</copy>
Run Code Online (Sandbox Code Playgroud)

不幸的是,这并没有工作,因为"REFID"和嵌套元素可以不混合.

有没有办法在源路径中获取一组所有非java文件而不将源路径列表复制到单个文件集中?

mar*_*ton 3

这是一个选项。首先,使用pathconvert任务创建适合生成文件集的模式:

<pathconvert pathsep="/**/*,"
             refid="de.his.path.srcpath"
             property="my_fileset_pattern">
    <filtermapper>
        <replacestring from="${basedir}/" to="" />
    </filtermapper>
</pathconvert>
Run Code Online (Sandbox Code Playgroud)

接下来,从路径中的所有文件(java 源除外)创建文件集。请注意,需要尾随通配符/**/*,因为 pathconvert 仅处理列表中的通配符,而不是末尾所需的通配符:

<fileset dir="." id="my_fileset" includes="${my_fileset_pattern}/**/*" >
     <exclude name="**/*.java" />
</fileset>
Run Code Online (Sandbox Code Playgroud)

那么你的复制任务将是:

<copy todir="${de.his.dir.bin.classes}" overwrite="true" >
    <fileset refid="my_fileset" />
</copy>
Run Code Online (Sandbox Code Playgroud)

/**/*为了可移植性,您可以考虑使用类似以下内容,而不是对 unix 通配符进行硬编码:

<property name="wildcard" value="${file.separator}**${file.separator}*" />
Run Code Online (Sandbox Code Playgroud)