如果文件存在,Ant +运行目标

时间:2013-01-10 14:33:39

标签: ant

只有当java文件存在于某个位置时,我才需要运行另一个任务。我搜索过相同的内容并遇到类似下面的内容:

<target name="check-abc">
<available file="abc.txt" property="abc.present"/>

</target>

<target name="do-if-abc" depends="check-abc" if="abc.present">     ... </target>

但在我的情况下,文件路径不固定。我有一个包含许多子目录和文件的目录。如果任何这些位置中存在java文件,则该属性应设置并运行第二个目标。请指教。

2 个答案:

答案 0 :(得分:0)

好的,我为此制定了一个解决方案,但您需要ant-contrib才能使其正常运行。

<target name="check-abc" depends="defineAntContribTasks">
    <path id="foo">
        <fileset dir="${src.dir}">
            <include name="**/*.java"/>
        </fileset>
    </path>
    <for param="some.file">
        <path refid="foo"/>
        <sequential>
            <echo message="checking @{some.file}"/>
            <property name="abc.present" value="true"/>
        </sequential>
    </for>
    <echo message="present = ${abc.present}"/>
</target>

<target name="do-if-abc" depends="check-abc" if="abc.present">
    <!-- whatever -->
</target>

你可能会抛弃回声陈述;他们大部分时间都可以看到正在检查的内容。

答案 1 :(得分:0)

我的示例使用custom script condition,在groovy中实现。

<project name="build" default="build">

    <path id="build.path">
        <pathelement location="lib/groovy-all-2.1.0-rc-1.jar"/>
    </path>

    <condition property="java.found">
        <scriptcondition language="groovy" value="false" classpathref="build.path">
            def ant = new AntBuilder()

            ant.fileset(id:"javaFiles", dir:"src", includes:"**/*.java")

            ant.project.references.javaFiles.each {
                self.value = true
            }
        </scriptcondition>
    </condition>

    <target name="build" if="java.found">
        <echo message="Found java files"/>
    </target>

</project>

或者,您可以编写自定义java条件,这样就无需在构建中嵌入脚本语言。