我正在为其基本运行,清理和编译属性编写构建文件。这就是我所拥有的:
<?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中我想用名字再用第二个名字运行它,我该怎么做?
答案 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)
您可以使用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文件中看起来更清晰,更明显。当然,您也可以混合使用这两种方法并从antcall
目标调用宏,反之亦然。