4

基本的な実行、クリーン、およびコンパイル プロパティのビルド ファイルを作成しています。ここに私が持っているものがあります:

<?xml version="1.0" encoding="ISO-8859-1"?>

<project default="compile">
   <description>
      Compile and run the Java files for Lab7
   </description>

   <target name="prob1" depends='compile'>
      <java classname='prob1'>
         <classpath path='./'/>
         <arg value='Gertrude'/>
         <arg value='Justin'/>
      </java>
   </target>

   <target name="prob2" depends='compile'>
      <java classname='prob2'>
         <classpath path='./'/>
         <arg value='28'/>
      </java>
   </target>

   <target name="prob3" depends='compile'>
      <java classname='prob3'>
         <classpath path='./'/>
         <arg value='2000'/>
      </java>
   </target>

   <target name="prob4" depends='compile'>
      <java classname='prob4'>
         <classpath path='./'/>
         <arg value='2'/>
      </java>
   </target>

  <target name="compile">
    <javac srcdir='./' includeantruntime="false"/>
  </target>

  <target name="clean">
    <delete>
        <fileset dir="./">
            <include name='*.class'/>
        </fileset>
    </delete>
  </target>
</project>

一度に1つずつ異なる引数で各probを実行しようとしています。prob1 のように、最初の名前で実行してから 2 番目の名前で実行したいのですが、どうすればよいですか?

4

3 に答える 3

2

はい、そのようなことは、for ループ、if 条件、マクロなどの幅広い機能を提供する antlib を使用して可能です。のようなマクロを定義できます。

<macrodef name="call-cc">
   <attribute name="target"/>
   <attribute name="param1">
   <attribute name="param2">
   <element name="yourtask">
      <java classname='$name'>
        <classpath path='./'/>
        <arg value='@{param1}'/>
        <arg value='@{param2}'/>
      </java>
   </element>

</macrodef>

そして、このように呼び出すことができます

<call-cc target="unittests" param1="bla" param2="blabla"/>

マニュアルでantlibについて読むことができます

于 2012-11-10T15:55:26.593 に答える
1

@Moataz と @jheddings によって説明されているように、ANTマクロ定義は、この種の反復的でパラメーター化されたアクションを抽象化する最良の方法です。

次の作業例では、プロパティを使用してプロジェクト ファイルの場所を抽象化したり、ANT パスを使用してランタイム クラスパスを制御したりするなど、ビルドをさらに改良することも示しています。

<project default="compile">

    <description>
    Example build file. Demonstrates the following
    - Properties
    - Build paths
    - Running java programs using a macrodef
    </description>

    <property name="src.dir"     location="src/main/java"/>
    <property name="build.dir"   location="build"/>
    <property name="classes.dir" location="build/classes"/>

    <path id="runtime.path">
        <pathelement location="${classes.dir}"/>
    </path>

    <macrodef name="call-prog">
        <attribute name="classname"/>
        <attribute name="arg1"/>
        <attribute name="arg2" default=""/>
        <sequential>
            <java classname='@{classname}' classpathref="runtime.path">
                <arg value='@{arg1}'/>
                <arg value='@{arg2}'/>
            </java>
        </sequential>
    </macrodef>

    <target name="compile">
        <mkdir dir="${classes.dir}"/>
        <javac destdir="${classes.dir}" srcdir='${src.dir}' includeantruntime="false"/>
    </target>

    <target name="clean">
        <delete dir="${build.dir}"/>
    </target>

   <target name="prob1" depends='compile'>
        <call-prog classname="org.demo.App" arg1="Justin" arg2="Gertrude"/>
   </target>

   <target name="prob2" depends='compile'>
        <call-prog classname="org.demo.App" arg1="28"/>
   </target>

   ..
   ..   
</project>

最後に、すべてのビルドで使用する一般的な macodefs のストアを構築したら、それらをANTlibとしてパッケージ化することを検討できます。私の意見では、ANT でビルド ロジックを共有する最良の方法です。この単純な例では、やり過ぎです。

于 2012-11-11T12:25:06.693 に答える
-1

antcall次のように使用してこれを行うことができますmacrodef

<target name="run-prob" depends="compile">
  <fail unless="prob-class" />
  <fail unless="prob-args" />

  <java classname="${prob-class}">
    <classpath path="./"/>
    <arg line="${prob-args}"/>
  </java>
</target>

<target name="prob1" depends="compile">
  <antcall target="run-prob">
    <param name="prob-class">prob1</param>
    <param name="prob-args">justin gertrude</param>
  </antcall>
</target>

<target name="prob2" depends="compile">
  <prob class="prob2">
    <arg value='28'/>
  </prob>
</target>

<macrodef name="prob">
  <attribute name="class" />
  <element name="args" implicit="true" />
  <sequential>
    <java classname="@{class}">
      <classpath path="./"/>
      <args />
    </java>
  </sequential>
</macrodef>

を使用する利点はantcall、次のようにコマンド ラインから呼び出しを実行できることです。

ant -Dprob-class=prob3 -Dprob-args=2000 run-prob

を使用する利点はmacrodef、ant ファイルでの見た目が少しすっきりして、より明確になることです。もちろん、2 つのメソッドを組み合わせてantcallターゲットからマクロを呼び出すことも、その逆も可能です。

于 2012-11-10T16:07:10.380 に答える