[英]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中共享构建逻辑的最佳方法。 对于这个简单的例子,这将是多余的。
您可以使用antcall
或macrodef
来执行此操作, 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.