через ответ Михаила , что составляло 90% от того, что мне было нужно, но не совсем так.
Фактическое решение, которое я нашел в результате ваших ответов, следующее:
<target name="clean" description="Clean output directories.">
<!-- Must not fail on error because it fails if directories don't exist.
Is there really no better way to do this? -->
<delete includeEmptyDirs="true" failonerror="false">
<fileset dir="${main.build.directory}" />
...
</delete>
<available
file="${main.build.directory}"
type="dir"
property="delete-main-failure" /> ...
<condition property="delete-failure">
<and>
<isset property="delete-main-failure" /> ...
</and>
</condition>
<fail
if="delete-failure"
message="Unable to delete previous build's directories." />
</target>
Это соответствует моим критериям, что код пытается удалить его, а затем терпит неудачу, если он все еще существует. Это супер уродливо, хотя. Поведение по умолчанию задачи удаления кажется мне очень странным. Я полагаю, что логическое обоснование состоит в том, что если вы пытаетесь что-то удалить, а его там нет, то что-то должно быть не так, но мне кажется, что нормальным случаем будет то, что если его там нет, вам все равно, потому что оно уже ушло, пока Странным случаем является то, что вам нужно, чтобы он был там, но теперь его не должно быть больше на этом конкретном этапе сборки.