繁体   English   中英

Java Ant build.xml问题

[英]Java Ant build.xml issue

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

<?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中一样,我想以第一个名称运行,然后再次以第二个名称运行,我该如何做?

是的,使用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"/>

您可以在手册中阅读有关antlib的信息。

正如@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>

最后,当您建立了在所有内部版本中使用的通用macodef的存储库时,可以考虑将它们打包为ANTlib 我认为,在ANT中共享构建逻辑的最佳方法。 对于这个简单的例子,这将是多余的。

您可以使用antcallmacrodef来执行此操作, antcall所示:

<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目标调用宏,反之亦然。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM