Это довольно небрежно, но работает.Ant на самом деле довольно легко написан на скрипте, и если вы используете хотя бы Java 6 (или это может быть Java 7), встроенная поддержка javascript и, следовательно, может использоваться прямо из коробки.Это определяет задачу, которая будет отображать зависимости любой цели в порядке вызова:
<scriptdef name="listdepends" language="javascript">
<attribute name="target"/>
<![CDATA[
var done = [];
var echo = project.createTask("echo")
function listdepend(t) {
done.push(t.getName());
var depends = t.getDependencies();
while (depends.hasMoreElements()) {
var t2 = depends.nextElement();
if (done.indexOf(t2)==-1) listdepend(project.getTargets().get(t2));
}
echo.setMessage(t.getName());
echo.perform();
}
var t = attributes.get("target");
if (t!=null) {
var targ = project.getTargets().get(t);
listdepend(targ);
}
]]>
</scriptdef>
В вашем случае вы можете создать новую цель (или нет) и вызывать ее так:
<target name="listfoo">
<listdepends target="foo"/>
</target>
Как я уже сказал, это несколько небрежно.Это, вероятно, не очень быстро (хотя, если ваша цель не вызывает тысячи других, это, вероятно, не заметно медленно).Он не будет обрабатывать задачи antcall (хотя его можно было бы легко изменить) или отвечать на атрибуты if и else.Если зависимости вкладываются слишком далеко, он может достигнуть предела глубины рекурсии (но я сомневаюсь, что любой проект вложит их достаточно глубоко).
Массив используется для того, чтобы убедиться, что каждая зависимость указана один раз (ant будет запускать их толькоодин раз).