如何使用Ant接受可选的命令行参数?

时间:2016-05-24 22:11:09

标签: java ant

我正在运行的java程序有2个强制命令行参数和一个可选的第三个参数。这是我目前的build.xml:

<project name="HashTest" basedir="." default="main">
        <property name="src.dir"        value="src"/>
        <property name="build.dir"      value="build"/>
        <property name="classes.dir"    value="${build.dir}/classes"/>
        <property name="jar.dir"        value="${build.dir}/jar"/>
        <property name="HashTest"       value="com.HashTest.HashTest"/>

        <target name="clean">
                <delete dir="${build.dir}"/>
        </target>

        <target name="compile">
                <mkdir dir="${classes.dir}"/>
                <javac srcdir="${src.dir}" destdir="${classes.dir}"/>
        </target>

        <target name="jar" depends="compile">
                <mkdir dir="${jar.dir}"/>
                <jar destfile="${jar.dir}/HashTest.jar" basedir="${classes.dir}">
                        <manifest>
                                <attribute name="Main-Class" value="${HashTest}"/>
                        </manifest>
                </jar>
        </target>


        <target name="run" depends="jar">
                <java jar="${jar.dir}/HashTest.jar" fork="true">
                        <arg value="${data}"/>
                        <arg value="${loadfactor}"/>
                        <arg value="${debug}"/>
                </java>
        </target>

        <target name="clean-build" depends="clean,jar"/>
        <target name="main" depends="clean,run"/>
</project>

这会强制用户输入3个参数。我尝试添加另一个运行目标,只定义了2个args但是ant并不喜欢它。我知道我可以创建两个单独命名的运行目标,一个有2个args,另一个有3个但是我想尽可能避免这个,为了简单起见。

我希望用户只需输入:

ant -Ddata=<num> -DloadFactor=<num> -Ddebug=<num>

或:

ant -Ddata=<num> -DloadFactor=<num>

2 个答案:

答案 0 :(得分:1)

假设您可以为每个属性提供默认值,您可以在build.xml中定义它们,然后在调用ant时仅覆盖您要提供的属性:

<project name="HashTest" basedir="." default="main">

    ...

    <!-- default values for each properties -->
    <property name="data" value="0"/>
    <property name="loadFactor" value="0"/>
    <property name="debug" value="1"/>

    ...

</project>

以下命令行:

ant -Ddata=1 -DloadFactor=10 -Ddebug=0

将使用参数1,10和0调用您的java程序。以下是:

ant -DloadFactor=3

将使用参数0,3和1调用它(使用datadebug参数的默认值)。

答案 1 :(得分:1)

如果您至少使用Ant 1.9.1,则可以使用ant:if or ant:unless to have optional arguments

首先,将ifunless命名空间添加到您的<project>元素...

<project name="tryit"
    xmlns:if="ant:if"
    xmlns:unless="ant:unless"
>

...然后将if:set添加到嵌套在<arg>下的<java>元素...

<arg value="${debug}" if:set="debug"/>