Предпочитая последнюю банку в море зависимостей (java)

У меня есть большой проект Ivy, и я заметил, что мой код, который хорошо работает в eclipse, вызывает ошибку компиляции при запуске в ant. Я сузил проблему до следующей строки:

FileUtils.write(...). 

Эта строка не работает - во время компиляции --- метод просто не найден. Очевидно, мой код зависит от библиотеки Apache commons-io. И совершенно ясно, что текущий метод commons-io имеет этот метод.

http://commons.apache.org/io/apidocs/org/apache/commons/io/FileUtils.html

Так что же дает ?

Я почти уверен, что это связано с моим ivy.xml -> компилятор eclipse, к счастью (или разумно), использует новейшую возможную версию commons-io , тогда как мой ivy.xml использует более старую версию, в которой отсутствует этот метод.

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

Итак, мой вопрос:

1) Как я могу сказать муравью / плющу предпочтительно компилировать мой код с последними версиями библиотек, которые я укажу? Я предполагаю, что некоторые зависимости в моей lib/ могут зависеть от более старых версий commons-io.....

Также :

2) В этом контексте мне также будут полезны любые подсказки о том, о чем беспокоиться в отношении того, как загрузчик классов обрабатывает дубликаты в проекте, зависящем от нескольких банок...


person jayunit100    schedule 20.03.2012    source источник
comment
Есть ли возможность перейти на Maven? Я знаю, что Maven всегда использует последнюю версию зависимости тривиально. Однако я полагаю, что у Ivy есть аналогичная функциональность. Это выглядит полезным: stackoverflow.com /вопросы/2399099/   -  person aroth    schedule 20.03.2012
comment
@aroth Переход на Maven не всегда подходит для больших устаревших сборок ANT. По моему опыту, Maven лучше всего подходит для новых проектов.   -  person Mark O'Connor    schedule 20.03.2012


Ответы (2)


Отчеты о зависимостях

Я бы посоветовал вам сначала добавить генерацию отчета о зависимостях ivy в вашу сборку, используя ссылку сообщить о задаче.

Пример этой задачи включен в следующий ответ:

Что такое эквивалент Ivy версий Maven :отображать-зависимости-обновления?

Это скажет вам, какие версии каких банок используются. Обычно ivy будет использовать версию, указанную вами в файле ivy.xml, однако другой модуль может зависеть от более поздней версии. Поведение Ivy по умолчанию — всегда отдавать предпочтение самой последней версии модуля Maven.

Получить последнюю зависимость

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

<dependency org="commons-io" name="commons-io" rev="latest.release"/>
person Mark O'Connor    schedule 20.03.2012

У Ivy есть функция под названием фиксированные и динамические версии. Вы можете установить версию/редакцию любого артефакта на последний-статус. нравится

rev="latest.integration" --> for development released
rev="latest.release" --> for released versions

Ivy берет версию с самой высокой версией (вы указали) и опускает все библиотеки с более низкими версиями, так что у вас есть только одна библиотека в пути к классам ivy (посмотрите отчет о разрешении, запустите ant -v (подробный режим)) ., что позволяет избежать дублирования банок с конфликтующими версиями.
Возможно, стоит проверить это, возможно, у вас просто определена старая версия в одном из ваших файлов ivy.

Что касается второго пункта:

Загрузчик классов берет класс, который оказывается первым в пути к классам (или банку, которая находится первой в пути к классам). Таким образом, смешанные версии одной и той же библиотеки могут вести себя по-разному в любой системе, в зависимости от того, как построен путь к классам.

person oers    schedule 20.03.2012