Java 8 здесь.Может ли Gradle помочь решить jar ад в любом случае?
Say есть старая версия widget
libray, с Maven координат widgetmakers:widget:1.0.4
, что есть класс, определенный в нем, как так:
public class Widget {
private String meow;
// constructor, getters, setters, etc.
}
проходят года. Составители этой библиотеки widget
решают, что Widget
никогда не должен meow
, скорее, это должно быть на самом деле bark
. И поэтому новый релиз сделан с Maven координатами widgetmakers:widget:2.0.0
и Widget
выглядит как:
public class Widget {
private Bark bark;
// constructor, getters, setters, etc.
}
Так что теперь я иду построить мое приложение, myapp
. И, желая использовать последние стабильные версии всех мои зависимостей, я объявляю мою зависимость, как так (внутри build.gradle
):
dependencies {
compile (
,'org.slf4j:slf4j-api:1.7.20'
,'org.slf4j:slf4j-simple:1.7.20'
,'bupo:fizzbuzz:3.7.14'
,'commons-cli:commons-cli:1.2'
,'widgetmakers:widget:2.0.0'
)
}
Теперь давайте скажем, что это (вымышленная) fizzbuzz
библиотеки имеет всегда зависело от 1.x библиотека widget
, где Widget
будет meow
.
Так что теперь, я указание 2 версии widget
на моей компиляции: пути к классам
widgetmakers:widget:1.0.4
который втягивается вfizzbuzz
библиотеки, как зависимость от него; иwidgetmakers:widget:2.0.0
который я ссылка непосредственно
Так, очевидно, в зависимости от того, какой версии Widget
получает classloaded первого, мы будем иметь либо Widget#meow
или Widget#bark
.
Есть ли в Gradle какие-либо средства для того, чтобы помочь мне здесь? Есть ли способ вытащить несколько версий одного и того же класса и настроить классы fizzbuzz
для использования старой версии Widget
, а также моих классов для использования новой версии? Если нет, то только решения я могу думать о том, являются:
- я мог бы быть в состоянии выполнить какое-то shading- и/или FatJar основе soltuion, где, возможно, я тянуть во всех своих зависимостей в виде пакетов под
myapp/bin
и затем дайте им разные префиксы версий. По общему признанию, я не вижу здесь ясного решения, но я уверен, что что-то возможно (но все же хакерское/противное). Или ... - Осмотрите весь график зависимостей и просто убедитесь, что все мои транзитивные зависимости не конфликтуют друг с другом. В этом случае для меня это означает либо отправку запроса на тягу к сопровождающим
fizzbuzz
, чтобы обновить его до последней версииwidget
, либо, к сожалению, понизить рейтингmyapp
, чтобы использовать старшую версиюwidget
.
Но Gradle (до сих пор) был для меня волшебным. Поэтому я спрашиваю: есть ли какая-нибудь магия Грейдла, которая может помочь мне здесь?
Единственный возможный способ, по которому я вижу, что вы можете правильно использовать две разные версии одной и той же библиотеки, - это перечислить каждую версию, где бы вы ни были сами или библиотекой. Если нет, тогда вам придется зависеть от версии Gradle. Также вы получите исключение класса/метода, не найденное, если это неправильная версия. Gradle может найти зависимости, которые отсутствуют и вытащить их, но вручную саботируя механизм разрешения зависимостей Gradle, запутав его с помощью двух библиотек, в конечном итоге не принесет пользы. –
Спасибо @WeareBorg (+1). ** (1) ** Когда вы говорите «* ссылаясь на каждую версию, где бы вы ни были сами или в библиотеке *», можете ли вы уточнить немного больше? Я был разработчиком JVM более 10 лет и не знаком с этой стратегией/подходом! Можете ли вы привести пример того, что вы имеете в виду? И ** (2) ** что такое поведение Gradle по умолчанию в этой ситуации? Оставленный нетронутым, какая версия библиотеки 'widget' будет Gradle в конечном итоге получить/решить? Еще раз спасибо! – smeeb
1) Я имел в виду что-то простое, но я знаю синтаксис для maven, где вы можете исключить библиотеку, в которой вам не понадобится определенная версия, поэтому другая версия автоматически вытягивается.2) Для градиента из-за добавлений в classpath он будет первым в списке, для maven он будет последним. –