【问题标题】:How does one use Ant to accept optional Command line arguments?如何使用 Ant 来接受可选的命令行参数?
【发布时间】:2023-08-18 08:36:02
【问题描述】:

我正在运行的 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 个参数的运行目标,但 ant 不喜欢它。我知道我可以创建两个单独命名的运行目标,一个具有 2 个 args,另一个具有 3 个参数,但为了简单起见,我想尽可能避免这种情况。

我希望用户只需输入:

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

或:

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

【问题讨论】:

    标签: java ant


    【解决方案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 参数的默认值)。

    【讨论】:

      【解决方案2】:

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

      首先,将ifunless 命名空间添加到您的&lt;project&gt; 元素...

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

      ...然后将if:set 添加到嵌套在&lt;java&gt; 下的&lt;arg&gt; 元素...

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

      【讨论】:

        最近更新 更多