Это происходит потому, что при параллельном выполнении <foreach>
использует задачу <parallel>
, но не устанавливает свойство failonany или дает какой-либо способ сказать, что задача должна завершиться неудачей, если какая-либо итерация не удалась.
К счастью, существует относительно простой обходной путь, который заключается в использовании <for>
вместо <foreach>
.В вашем примере это будет выглядеть так:
<target name="build">
<for param="foreach.dir" parallel="true" list="1,2,3">
<sequential>
<antcall target="exex-subant" inheritall="true">
<param name="target" value="build" />
<param name="foreach.dir" value="@{foreach.dir}" />
</antcall>
</sequential>
</for>
</target>
Обратите внимание, что вы должны явно передать свойство foreach.dir, которое затем будет доступно в цели exex-subant как ${foreach.dir}
.
Это выполнит все итерации параллельно, но скрипт не выполнится, если произойдет сбой любой из них (он не выполнит ничего, кроме задачи for).
Обратите внимание, что для использования *Задача 1015 *, вам понадобится ant 1.6 или выше, и вам нужно изменить значение taskdef на:
<taskdef resource="net/sf/antcontrib/antlib.xml">
<classpath>
<pathelement location="../lib/ant/ant-contrib-1.0b3.jar" />
</classpath>
</taskdef>
Если по какой-то причине вам нужна поддержка более старых версий ant, вам придется изменитьцель exex-subant немного, так что она изменила что-то, когда потерпела неудачу.Например, вы можете обернуть текущую логику в exex-subant внутри try / catch, а в блоке catch она может создать файл.Затем, после завершения foreach, вы можете проверить, существует ли этот файл, и в противном случае выполнить сборку.Таким образом, если какое-либо выполнение foreach завершится неудачно, сценарий ant завершится неудачно после завершения foreach.
Обратите внимание, что вы не можете просто установить свойство в exex-subant при сбое, так как свойство не будетраспространяться обратно в цикл foreach (вот почему я предложил создать файл).Но я настоятельно рекомендую просто использовать задачу for
и требовать муравей 1.6 или выше.