Предоставлена ​​зависимость в библиотеке, используя предыдущую версию в проекте.

Если библиотека объявляет предоставленную зависимость, например, от servlet-api с использованием версии 3.0.1; смогут ли пользователи использовать версию 2.5 для своей библиотеки, которая будет использоваться в стороннем веб-приложении?

Другими словами:

mylib (srv 3.0.1)  <-- some_framework(srv 2.5)  <--  user_webapp (tomcat 6 or 7)

Более того: версия 2.5 объявлена ​​как javax.servlet:servlet-api:2.5, а версия v3.0.1 объявлена ​​как javax.servlet:javax.servlet-api:3.0.1. strong>, так что разница есть.

Будет ли проблемой для some_framework указать другую зависимость servlet-api (например, 2.5), чем определено в mylib (например, 3.0)? Я предполагаю, что поскольку область предоставляется (и доступна только во время компиляции), инструменты зависимостей (mvn, gradle...) не будут загружать ее в some_framework, и у них есть (и разрешено) объявлять зависимость вручную.

(да, я знаю о различиях между 3.0 и 2.5, и это не вопрос. Я также предполагаю, что все компилируется правильно и т. д. Мне просто интересно, как maven будет компилировать some_framework, от которого зависит: 2,5 или 3?).


person igr    schedule 14.05.2013    source источник
comment
Maven достаточно гибок, чтобы поддерживать любой сценарий с достаточной ручной настройкой, если вы об этом спрашиваете. Если проект X зависит от проекта Y, в x/pom.xml я могу объявить, что он должен игнорировать (исключать) данную зависимость от Y. (Что я бы и сделал, если бы я автор some_framework в вашем примере.) Тем не менее, если вы не сделаете это явно, я предполагаю, что Maven просто скомпилирует ваш проект против обоих.   -  person millimoose    schedule 14.05.2013
comment
Тем не менее, не очень понятно, о чем здесь ваш вопрос, здесь задействовано много связанных концепций. Конфликт версий JAR не будет проблемой для Maven, но может привести к сбою сборки. А может и нет, в зависимости от того, как javac обрабатывает повторяющиеся классы в пути к классам (я считаю, что первый найденный выигрывает) и как Maven создает путь к классам для начала.   -  person millimoose    schedule 14.05.2013
comment
@milimoose Я не хочу ничего исключать вручную. Предполагая, что ошибки компиляции нет (а почему она должна быть? some_framework использует только 2.5, так что у нас все хорошо). Вы предполагаете, что Maven будет компилироваться с использованием обоих, или вы знаете это? :) Как я предполагаю по-другому.   -  person igr    schedule 14.05.2013


Ответы (1)


Позвольте мне ответить на мой собственный вопрос, так как [SO] никогда не помогал с хитрыми :)

Я создал простой проект maven (который будет действовать как some_framework). Это зависит от jodd-servlet (mylib), для которого сервлеты 3.0.1 указаны как предоставленные зависимости. Когда я бегу

mvn dependency:resolve

я не вижу сервлеты в списке зависимостей. Теперь, если текущий проект (например, some_framework) перечисляет сервлеты версии 2.5 как зависимость; а потом, если я снова запускаю ту же команду, я вижу только зависимость от 2.5.

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

person igr    schedule 14.05.2013