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によってファイルが2回更新されないように、プログラムにロジックを追加したいと思います。その上、すでに行われた作業を複製することは悪い形です。

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.に渡します。しかし、彼が言ったように、それはうまくいきませんでした。(申し訳ありませんが、彼の代名詞を間違えた場合は、パトリスは男性または女性の名前の両方になる可能性があります。)

私がしなければならなかったことは、2 つの監視ファイルを作成することでした。1 つは Java コンパイル用で、もう 1 つは 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 を実行する場合にのみ、JiBX の古い監視ファイルを作成する必要があり、それは JiBX の内部にあり<outofdate>ます。

念のため、XML JiBX ファイルにもソースを配置できると思います。

于 2012-10-19T19:43:48.317 に答える