3

我们正在使用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 不会两次更新文件。此外,重复已经完成的工作是一种不好的形式。

4

2 回答 2

2

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

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

仅当该标记文件比 .class 文件更旧时才执行 jibx 构建步骤(表明 javac 比上一个 jibx 运行得更近)。

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

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

然后在调用jixb 目标时将该属性与一个unless 子句一起使用。

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

<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>
于 2012-10-19T05:13:31.957 回答
0

我把这个交给Patrice M.因为他的建议让我走上了正轨。然而,并没有像他所说的那样完全奏效。(对不起,如果我把他的代词弄错了,但帕特里斯既可以是男性也可以是女性。)

我要做的是创建两个监视文件:一个用于 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 监视文件,因为那是我编译的时候。<outofdate>仅当我运行 JiBX 并且位于for JiBX中时,我才必须创建 JiBX 过期监视文件。

我想我也可以在 XML JiBX 文件上放一个源代码来确定。

于 2012-10-19T19:43:48.317 回答