Java Ant build.xml问题

时间:2012-11-10 14:53:35

标签: java ant build.xml

我正在为其基本运行,清理和编译属性编写构建文件。这就是我所拥有的:

<?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中我想用名字再用第二个名字运行它,我该怎么做?

3 个答案:

答案 0 :(得分:2)

是的,使用antlib可以做到这一点,antlib提供了很多功能,比如for循环,如果是条件和宏。您可以定义像

这样的宏
<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"/>

您可以在the manual

中阅读有关antlib的内容

答案 1 :(得分:1)

正如@Moataz和@jheddings所解释的那样,ANT macrodef是抽象这些重复和参数化动作的最佳方式。

以下工作示例还演示了对构建的一些进一步改进,例如使用属性来抽象项目文件的位置以及使用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>

最后,当您构建了一个在所有构建中使用的常用宏代码存储时,您可以考虑将它们打包为ANTlib。在我看来,在ANT中分享构建逻辑的最佳方式。对于这个简单的例子,这将是过度的。

答案 2 :(得分:-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目标调用宏,反之亦然。