Похоже, есть две проблемы:
- В условии равенства для первого if, у вас есть
@{maindir}
. Если это не параметр макроса, он должен быть ${maindir}
, таким же, как в остальной части вашего примера
- Если свойство не было установлено, оно не будет оцениваться ни для чего. Поэтому, если maindir не определен,
${maindir}
будет иметь значение ${maindir}
, а не пустую строку.
Самый простой способ решить эту проблему - заменить знак @ на знак $ и добавить оператор в начале, чтобы свойство по умолчанию имело значение:
<property name="maindir" value="." />
Это свойство по умолчанию будет соответствовать текущему каталогу, поэтому вы можете полностью исключить внешний if, так как он больше не понадобится. Свойства в ant доступны только для чтения, поэтому, если пользователь явно указывает значение (например, из командной строки), это значение будет использоваться вместо этого, и приведенная выше строка не будет иметь никакого эффекта - это будет иметь эффект, только если пользователь не указал не указывайте значение для maindir.
На самом деле, я думаю, что вы можете полностью избавиться от ant-contrib, выполнив следующее:
<property name="maindir" value="." />
<fail message="${maindir}/build.properties is not a valid path.">
<condition>
<not>
<available file="${maindir}/build.properties" />
</not>
</condition>
</fail>
<property file="${maindir}/build.properties" />
Это должно иметь тот же эффект, который вы ожидали достичь на своем примере.