Ant:源文件和目标文件是相同的。如何检测变化?

时间:2012-10-18 21:15:48

标签: ant

我们正在使用JiBX。重要的是要知道JiBX修改已编译的类文件。

我们编译:

<javac destdir="${main.destdir}">
    <src path="${main.srcdir}"/>
    <classpath refid="main.classpath"/>
</javac>

然后,我们打电话给JiBX:

<jibx load="true"
    binding="{$binding.file}">
    <classpath refid="main.classpath"/>
    <classpath refid="main.destdir.classpath"/>
</jibx>

这使用一个XML文件来更新上面<javac>编译的类文件。问题是如何知道文件已编译,但未由JiBX处理?我想在我的程序中加入一些逻辑,因此JiBX不会对文件进行两次更新。此外,重复已经完成的工作是不好的形式。

2 个答案:

答案 0 :(得分:2)

在jibx构建步骤之后,生成一个标记文件,例如

<touch file="${target.dir}/jibx.marker" />

如果该标记文件早于.class文件(表示javac比最后一个jibx运行得更新),则仅执行jibx构建步骤。

对于那一点逻辑,你可以使用传统的蚂蚁方式:

<uptodate property="jibx.uptodate" targetfile="${target.dir}/jibx.marker">
   <srcfiles dir="${main.destdir}" includes="...../*.class" />
</uptodate>

然后在调用jixb目标时使用带有unless子句的属性。

或者,您可以使用Antcontrib的outofdate替代方案:

<outofdate>
  <sourcefiles>
    <fileset dir="${main.destdir}" includes="...../*.class" />
</sourcefiles>
<targetfiles>
    <fileset dir="${target.dir}" includes="jibx.marker"/>
</targetfiles>
<sequential>
    <jibx load="true"
        binding="{$binding.file}">
        <classpath refid="main.classpath"/>
        <classpath refid="main.destdir.classpath"/>
    </jibx>
</sequential>
</outofdate>

答案 1 :(得分:0)

我这是给Patrice M.的,因为他的建议让我走上正轨。然而,正如他所说,它并没有完全奏效。 (对不起,如果我说他的代名词是错的,但Patrice可以是男性或女性的名字。)

我要做的是创建两个监视文件:一个用于Java编译,一个用于JiBX更改。

<!-- Check if Javac is out of date. If so, create javac watcher -->
<outofdate verbose="true">
    <sourcefiles>
        <fileset dir="${main.srcdir}">
            <include name="*.java"/>
        </fileset>
    </sourcefiles>
    <mapper type="regexp"
        from="${main.srcdir}/(.*)\.java"
        to="${main.destdir}/(\1).class"/>
    <sequential>
        <echo message="Java compiled"/>
        <echo message="Java compiled"
            file="${target.dir}/${javac.monitor.file}"/>
    </sequential>
</outofdate>

<javac destdir="${main.destdir}"
    debug="${javac.debug}">
    <src path="${main.srcdir}"/>
    <classpath refid="main.classpath"/>
</javac>

<!-- Compare javac and jibx monitoring file -->
<!-- If out of date, rerun jibx -->
<outofdate>
    <sourcefiles>
        <fileset dir="${target.dir}">
            <include name="${javac.monitor.file}"/>
        </fileset>
    </sourcefiles>
    <targetfiles>
        <fileset dir="${target.dir}">
            <include name="${jibx.monitor.file}"/>
        </fileset>
    </targetfiles>
    <sequential>
        <jibx load="true"
            binding="${target.dir}/binding-gg.xml">
            <classpath refid="main.classpath"/>
            <classpath refid="main.destdir.classpath"/>
        </jibx>

        <!-- Create JiBX monitoring file -->
        <echo message="Compiled and JiBX"
            file="${target.dir}/${jibx.monitor.file}"/>
    </sequential>
</outofdate>

如果源代码已经过时,我会创建javac监控文件,因为这是我编译的时候。我必须创建JiBX outofdate监控文件,只有当我运行JiBX并且它在JiBX的<outofdate>内时。

我想我也可以在XML JiBX文件上放一个来源,以确保。