【问题标题】:Use Ant for running program with command line arguments使用 Ant 运行带有命令行参数的程序
【发布时间】:2011-04-13 10:51:36
【问题描述】:

我的程序获取命令行参数。用Ant怎么传呢?

【问题讨论】:

    标签: java ant


    【解决方案1】:

    扩展Richard Cook的回答。

    这是运行任何程序(包括但不限于 Java 程序)的ant 任务:

    <target name="run">
       <exec executable="name-of-executable">
          <arg value="${arg0}"/>
          <arg value="${arg1}"/>
       </exec>
    </target>
    

    这是从 .jar 文件运行 Java 程序的任务:

    <target name="run-java">
       <java jar="path for jar">
          <arg value="${arg0}"/>
          <arg value="${arg1}"/>
       </java>
    </target>
    

    您可以像这样从命令行调用:

    ant -Darg0=Hello -Darg1=World run
    

    确保使用-Darg 语法;如果你运行这个:

    ant run arg0 arg1
    

    然后ant 将尝试运行目标arg0arg1

    【讨论】:

    【解决方案2】:

    如果您不想为每个可能的参数处理单独的属性,我建议您使用:

    <arg line="${args}"/>
    

    您可以使用具有unless 属性和内部执行的特定目标来检查属性是否未设置:

    <input message="Type the desired command line arguments:" addProperty="args"/>
    

    把它们放在一起给出:

    <target name="run" depends="compile, input-runargs" description="run the project">
      <!-- You can use exec here, depending on your needs -->
      <java classname="Main">
        <arg line="${args}"/>
      </java>
    </target>
    <target name="input-runargs" unless="args" description="prompts for command line arguments if necessary">
      <input addProperty="args" message="Type the desired command line arguments:"/>
    </target>
    

    您可以按如下方式使用它:

    ant
    ant run
    ant run -Dargs='--help'
    

    前两个命令会提示输入命令行参数,而后一个不会。

    【讨论】:

    • 我喜欢你在没有 -Dargs 的情况下提出的解决方案
    【解决方案3】:

    将参数传递到构建中的唯一有效机制是使用 Java 属性:

    ant -Done=1 -Dtwo=2
    

    以下示例演示了如何检查并确保已将预期参数传递到脚本中

    <project name="check" default="build">
    
        <condition property="params.set">
            <and>
                <isset property="one"/>
                <isset property="two"/>
            </and>
        </condition>
    
        <target name="check">
            <fail unless="params.set">
            Must specify the parameters: one, two
            </fail>
        </target>
    
        <target name="build" depends="check">
            <echo>
            one = ${one}
            two = ${two}
            </echo>
        </target>
    
    </project>
    

    【讨论】:

    • 当我不知道我将拥有多少个 args 时,xml 看起来如何?
    • 如果 args 的数量不是恒定的怎么办?
    • 如果 args 的数量不是恒定的,那么你能做的最好的可能就是 ant -Dvarargs="Hello World。很高兴认识你!"运行
    • 将整个文件作为工作练习真的很有帮助 - 我们从来没有弄清楚为什么参数传递在我们的原始文件中不起作用,但成功地修改了工作文件以包含所有需要的功能打破参数...
    • 如果我只需要传递某种切换器(例如 bash 命令中的 -f),即没有值的选项怎么办?看起来像“-Drelease”或“-Drelease=”触发错误重新丢失属性值
    【解决方案4】:

    您能否更具体地说明您正在尝试做什么以及如何尝试?

    如果您尝试使用&lt;exec&gt; 任务调用程序,您可以执行以下操作:

    <exec executable="name-of-executable">
      <arg value="arg0"/>
      <arg value="arg1"/>
    </exec>
    

    【讨论】:

      【解决方案5】:

      我最后做的是制作一个批处理文件从ant文件中提取CLASSPATH,然后直接使用这个运行java:

      在我的 build.xml 中:

      <target name="printclasspath">
          <pathconvert property="classpathProp" refid="project.class.path"/>
          <echo>${classpathProp}</echo>
      </target>
      

      在另一个名为“run.sh”的脚本中:

      export CLASSPATH=$(ant -q printclasspath | grep echo | cut -d \  -f 7):build
      java "$@"
      

      它不再是跨平台的,但至少它相对容易使用,并且可以提供一个与 run.sh 功能相同的 .bat 文件。这是一个非常短的批处理脚本。这不像将整个构建迁移到特定于平台的批处理文件。

      我认为很遗憾,在 ant 中没有一些选项可以让您执行以下操作:

      ant -- arg1 arg2 arg3
      

      mpirun 使用这种类型的语法;我认为 ssh 也可以使用这种语法。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-09-30
        • 1970-01-01
        • 1970-01-01
        • 2014-04-27
        • 1970-01-01
        • 1970-01-01
        • 2011-08-23
        相关资源
        最近更新 更多