Используйте Ant для запуска программы с аргументами командной строки


моя программа получает аргументы командной строки. Как я могу передать его, когда я использую Ant?

5 55

5 ответов:

расширения Ричард Кук'ы ответ.

здесь ant задач для запуска любой программы (включая, но не ограничиваясь Java программы):

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

вот задача запустить программу Java из .jar file:

<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 попытается запустить цели arg0 и arg1.

если вы не хотите обрабатывать отдельные свойства для каждого возможного аргумента, я предлагаю тебе использовать:

<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'

первые две команды будут запрашивать аргументы командной строки, а последние-нет.

единственным эффективным механизмом передачи параметров в сборку является использование свойств 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>

можете ли вы быть немного более конкретным о том, что вы пытаетесь сделать и как вы пытаетесь это сделать?

Если вы пытаетесь вызвать программу с помощью <exec> задача вы можете сделать следующее:

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

то, что я сделал в конце концов, это сделать пакетный файл для извлечения пути к классам из файла ant, а затем запустить java непосредственно с помощью этого:

В моей сборке.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 "$@"

Это уже не кросс-платформенный, но, по крайней мере, он относительно прост в использовании, и можно было бы обеспечить .bat файл, который делает то же самое, что и run.sh это очень короткий пакетный скрипт. Это не похоже на перенос всей сборки в пакет для конкретной платформы файлы.

Я думаю, что это позор, что в ant нет какой-то опции, с помощью которой вы могли бы сделать что-то вроде:

ant -- arg1 arg2 arg3

mpirun использует этот тип синтаксиса; ssh также может использовать этот синтаксис, я думаю.