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>

我试图一次用不同的参数运行每个概率。就像在 prob1 中一样,我想用第一个名字运行它,然后用第二个名字再次运行它,我该怎么做?

4

3 回答 3

2

是的,使用 antlib 可以实现类似的功能,它提供了广泛的功能,例如 for 循环、if 条件和宏。您可以定义一个宏,如

<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>

最后,当您建立了在所有构建中使用的通用 maccodef 存储时,您可以考虑将它们打包为ANTlib。在我看来,在 ANT 中共享构建逻辑的最佳方式。对于这个简单的例子,这将是矫枉过正。

于 2012-11-11T12:25:06.693 回答
-1

您可以使用antcallmacrodef这样做:

<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文件中看起来更干净、更明显。当然,您也可以混合使用这两种方法并从您的antcall目标调用宏,反之亦然。

于 2012-11-10T16:07:10.380 回答