Моя цель, имеют мою сборку сценария сборки муравья военный файл и включают банки, что плющ знает, что этот проект зависит от. Лучший код, который я мог придумать в данный момент, следующий
<mkdir dir="dist/lib"/>
<ivy:retrieve pattern="dist/lib/[artifact].[ext]" sync="true"/>
<war destfile="dist/${ivy.module}.war" basedir="build" includes="**/*.class"
webxml="${war.webxml}">
<fileset dir="${war.web}"/>
<lib dir="dist/lib"/>
</war>
Проблема с этим кодом, это копирует банки дважды. Однажды в к моему dist/lib каталогу и снова в к войне, когда это создается. Это работает, но я не могу встряхнуть чувство, что существует лучший путь.
То, что я хотел бы сделать, является чем-то больше как следующее
<ivy:cachepath pathid="locpathref.classpath"/>
<war destfile="dist/${ivy.module}.war" basedir="build" includes="**/*.class"
webxml="${war.webxml}">
<fileset dir="${war.web}"/>
<lib refid="locpathref.classpath"/>
</war>
Проблема состоит в том, что тег lib не берет в ремонте никакого вида. Какие-либо идеи или застревают я с дополнительным набором копий файла?
Проблема здесь заключается в том, что тег lib - это пользовательский файл , который нацелен на файлы в архиве войны каталог. Можно ли можно было написать пользовательский войну , но я не думаю, что это стоит усилий.
Если хотите улучшить способом, в котором плющ управляет зависимостями вашей войны, могу ли я предложить с помощью конфигураций?
Создайте конфигурацию, описывающую зависимости завода:
<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>
После этого вы извлекаете их в выделенный каталог (используя шаблон ) который можно просто включить использование войны TACKS 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>
Преимущество этого подхода заключается в том, что вы используете атрибут AVY CONT каждого проекта Зависимость в конечном итоге решить, включена ли jar в файл войны или нет. Файл сборки больше не заботится.
В заключение я понимаю, что точка вашего поста была обеспокоена несколькими копиями ваших файлов JAR ... Использование моего предложенного подхода будет еще несколько копий, но я бы поставлю, что это не при условии, что у вас есть Clean Цель, чтобы удалить их после этого.