Как убедиться, что свойство result установлено последней целью муравья?

Итак, вот ситуация. У меня есть цель с именем ErrorHelp, которая принимает значение exitCode и передает его в функцию, которая распечатывает сообщение на основе этого значения. Каждая из множества других целей имеет exitCode в качестве своего resultproperty, поэтому говорят, что они выходят с кодом 4, тогда exitCode равно 4 и ErrorHelp передает значение 4.

Бег, например,

>> Target1 ErrorHelp

дает правильное значение ErrorHelp. Однако возьмем следующую ситуацию. Я запускаю Target1 таким образом, чтобы знать, что он вернет значение 1; Я запускаю Target2 таким образом, что знаю, что он вернет 2. Можно было бы надеяться, что запущенный

>> Target1 Target2 ErrorHelp

приведет к запуску ErrorHelp со значением 2; это не тот случай, и вместо этого выполняется значение 1. Может ли вторая цель в той же строке не сбросить значение exitCode? Если нет, есть ли способ добиться того, что я пытаюсь сделать?

ИЗМЕНИТЬ - укажите код:

Скажем, Target1 определяется как

<target name="Target1">
    <java classname="path_to_file/Target1" fork="true" resultproperty="exitCode">
        <classpath>
            <path location="path_to_jar/required_jar.jar"/>
        </classpath>
    </java>
    <antcall target="ErrorHelp"/>
</target>

и Target2

<target name="Target2">
    <java classname="path_to_file/Target2" fork="true" resultproperty="exitCode">
        <classpath>
            <path location="path_to_jar/required_jar.jar"/>
        </classpath>
    </java>
    <antcall target="ErrorHelp"/>
</target>

(идентичен по структуре, но вызывает другой файл Java). ErrorHelp тогда будет

<target name="ErrorHelp">
    <java classname="path_to_file/ErrorCodeHelp" fork="true">
        <classpath>
            <path location="path_to_jar/required_jar.jar"/>
        </classpath>
        <arg value="-exitcode=${exitCode}"/>
    </java>
</target>

В ситуации, когда я звоню

>> Target1 Target2 ErrorHelp

зная, что Target1 возвращает 1, а Target2 возвращает 2, ErrorHelp распечатывает сообщение для значения 1, а не 2, как я ожидал.


person jako218    schedule 03.09.2015    source источник
comment
вы можете предоставить код?   -  person MyPasswordIsLasercats    schedule 03.09.2015
comment
Из сценария ant или со стороны Java (то есть что на самом деле вызывает ErrorHelp)?   -  person jako218    schedule 03.09.2015


Ответы (2)


Это не «решение», но я знаю, почему оно терпит неудачу, и я полагаю, что это кое-что.

Проблема в том, что exec устанавливает свойство с именем exitCode, а в Ant, как только свойство установлено, его нельзя изменить (или сбросить). Мой обходной путь в этой ситуации - использовать переменную отметки времени для создания уникальных имен свойств для каждого запуска задачи. (Это проще сделать в блоке scriptdef, чем в задачах с тегом xml, но концепция та же. Вам, вероятно, потребуется использовать переменные из ant-contrib, чтобы это работало.)

Это очень и очень неудачный способ решения простой проблемы. Если вы можете выяснить, как отключить свойство, вы сможете повторно использовать то же имя свойства. На этом фронте мне не повезло.

person Mark Gaulin    schedule 23.06.2016

Прежде всего, НЕ используйте antcall, он больше не требуется после Ant 1.6 (выпущен в 2004 г.).
Macrodef был реализован с Ant 1.6 для этой цели.
Решением вашей проблемы является сочетание macrodef и local task (доступно с Ant 1.8). Пример. Макроопределение, создающее свойство, вызываемое из разных целей:

<project default="main">

  <target name="one">
   <print property="foo" value="bar"/>
  </target>

  <target name="two">
    <print property="foo" value="baz"/>
  </target>

  <macrodef name="print">
   <attribute name="property"/>
   <attribute name="value"/>

   <sequential>
    <local name="@{property}"/>
    <property name="@{property}" value="@{value}"/>
    <echo>$${property} = ${property}</echo>
   </sequential>
  </macrodef>

<target name="main" depends="one,two"/>

вывод:

one:
     [echo] ${foo} = bar
two:
     [echo] ${foo} = baz
main:

В вашем случае это будет примерно так:

  <macrodef name="foobar">
   <attribute name="class1"/>
   <attribute name="path1"/>
   <attribute name="class2"/>
   <attribute name="path2"/>
   <attribute name="rc"/>

   <sequential>
    <local name="@{rc}"/>
    <java classname="@{class1}" fork="true" resultproperty="@{rc}">
     <classpath>
     <path location="@{path1}"/>
    </classpath>
    </java>

    <java classname="@{class2}" fork="true">
     <classpath>
      <path location="@{path2}"/>
     </classpath>
     <arg value="-exitcode=${@{rc}}"/>
    </java>

    <!-- .. other stuff if needed -->

   </sequential>
  </macrodef>

    <foobar
     class1="path_to_file/Target1"
     path1="path/to/required/jar/xyz.jar"
     rc="whatever"
     class2="path_to_file/ErrorCodeHelp"
     path2="another/path/to/required/jar/abc.jar2
    />

Макроопределение сочетает вызов класса Java с вызовом класса Errorhelper, принимающего код возврата из класса Java в качестве аргумента. Будет работать, если вы используете одно и то же имя resultpropertyname в Target1 и Target2, вызывая macrodef, или используйте разные имена, если хотите. Я не буду повторять все недостатки использования antcall (performance => открывает новую область проекта, разрывает целевую цепочку зависимостей ..), просто ищите в Интернете.

person Rebse    schedule 24.06.2016