Предпочитая последнюю банку в море зависимостей (java) - PullRequest
2 голосов
/ 20 марта 2012

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

FileUtils.write(...). 

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

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

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

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

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

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

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

Также:

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

Ответы [ 2 ]

3 голосов
/ 20 марта 2012

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

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

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

Что такое эквивалент Ivy версий Maven: display-dependency-updates?

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

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

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

<dependency org="commons-io" name="commons-io" rev="latest.release"/>
1 голос
/ 20 марта 2012

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

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

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

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

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

...