Получить плющ: получить, чтобы не копировать банку в две конфигурации? - PullRequest
0 голосов
/ 21 июня 2010

Я пытаюсь настроить свою сборку ant так, чтобы цели, на которых выполняются функции Ivy, были полностью отделены от целей, на которых выполняется непрерывная сборка, и на которых работает большинство разработчиков. Я хочу, чтобы одна цель загружала обновленные зависимости, которые я проверю. Другие цели будут устанавливать свой путь к классу, включая * .jar из соответствующего каталога.

У меня есть две конфигурации:

<configurations>
    <conf name="compile" />
    <conf name="test" />
</configurations>

У меня есть некоторые зависимости:

<dependency
    org="my.org"
    name="some-lib"
    rev="latest.release"
    conf="compile->default" />
<dependency
    org="my.org"
    name="some-test-lib"
    rev="latest.release"
    conf="test->default" />

И я загружаю эти зависимости и их транзитивные зависимости, используя ivy: retrieve:

<ivy:retrieve
    pattern="lib/[conf]/[type]/[artifact]-[revision].[ext]"
    sync="true"
    file="ivy.xml" />

Проблема в том, что я вижу несколько дубликатов jar между компиляцией и тестовыми каталогами, которые происходят из транзитивных зависимостей. Поскольку я хочу проверить все эти банки и использовать их для создания путей к классам, я бы хотел избежать дубликатов. Это возможно?

Библиотека / компиляция / банка / некоторые Пбы-1.0.jar
Библиотека / компиляция / банка / SLF4J-апи-1.5.11.jar
Библиотека / тест / банка / некоторый тест Пб-1.0.jar
Библиотека / тест / банка / JUnit-4.7.jar
lib / test / jar / slf4j-api-1.5.11.jar

Ответы [ 3 ]

3 голосов
/ 22 июня 2010

Это не дублирование, каждая конфигурация представляет собой отдельный набор jar-файлов, и задача ivy restrieve точно создает каждый набор ....

Возможно, было бы более разумно создавать пути к классам напрямую, а не заполнять локальный каталог lib .

Вот фрагмент моих файлов сборки ANT:

<target name="get-dependencies">
    <ivy:resolve/>

    <ivy:cachepath pathid="compile.path" conf="compile" />
    <ivy:cachepath pathid="test.path" conf="test" />
</target>

<target name="compile" depends="get-dependencies">
    <javac srcdir="src" destdir="build/classes" classpathref="compile.path"/>
</target>

Обычно я использую задачу ivy retrieve только когда мне нужно создать локальную копию набора jar-файлов, например, собрать каталог веб-приложения:

<ivy:retrieve pattern="build/WEB_INF/lib/[artifact].[ext]" conf="runtime"/>

Обновление

Другой альтернативой является указание ivy исключить модуль slf4j при загрузке переходных зависимостей следующим образом:

<dependency org="my.org" name="some-lib" rev="latest.release" conf="compile->default">
    <exclude module="slf4j-api"/> 
</dependency>

<dependency org="my.org" name="some-test-lib" rev="latest.release" conf="test->default">
    <exclude module="slf4j-api"/> 
</dependency>
0 голосов
/ 24 июня 2010

Попробуйте следующее. Ваш тест должен продлить компиляцию

<dependency
org="my.org"
name="some-test-lib"
rev="latest.release"
conf="**test->compile**" />

Если я прав, IVY обнаружит, что тест расширяет компиляцию и загрузит slf4j только один раз.

0 голосов
/ 23 июня 2010

Если бы я мог сделать это напрямую через Айви, это было бы лучше. Сейчас я решил эту проблему, просто удалив дубликаты с помощью муравья.

...