Проблема здесь в том, что тег lib представляет собой пользовательский набор файлов , который нацеливает свои файлы в подкаталог lib военного архива. Возможно, можно написать пользовательское задание war , но я не думаю, что оно того стоит.
Если вы хотите улучшить способ, которым ivy управляет зависимостями вашей войны, я мог бы предложить использовать конфигурации?
Создать конфигурацию, описывающую зависимости времени выполнения:
<ivy-module version="2.0">
<info organisation="apache" module="hello-ivy"/>
<configurations>
<conf name="build" description="Libraries needed to for compilation"/>
<conf name="war" extends="build" description="Libraries that should be included in the war file" />
</configurations>
<dependencies>
<dependency org="commons-lang" name="commons-lang" rev="2.0" conf="build->*,!sources,!javadoc"/>
<dependency org="commons-cli" name="commons-cli" rev="1.0" conf="build->*,!sources,!javadoc"/>
</dependencies>
</ivy-module>
После этого вы извлекаете их в специальный каталог (используя шаблон), который можно просто включить с помощью тега war задачи lib :
<ivy:retrieve pattern="${lib.dir}/[conf]/[artifact].[ext]"/>
<war destfile="${war.file}" webxml="${resources.dir}/web.xml">
<fileset dir="${resources.dir}" excludes="web.xml"/>
<lib dir="${lib.dir}/war"/>
</war>
Преимущество этого подхода заключается в том, что вы используете атрибут ivy conf каждой зависимости проекта, чтобы в конечном итоге решить, будет ли файл jar включен в файл war или нет. Файл сборки больше не заботится.
В заключение я понимаю, что смысл вашего поста касался нескольких копий ваших jar-файлов ... Использование предложенного мной подхода приведет к увеличению количества ваших копий, но я бы сказал, что это не проблема, если у вас есть clean target для последующего их удаления.