Предоставена зависимост в библиотеката, като се използва предишна версия в проекта

Ако библиотека декларира предоставена зависимост от например servlet-api, използвайки v3.0.1; възможно ли е потребителите да използват версия 2.5 за своята библиотека, която ще се използва в уеб приложение на трета страна?

С други думи:

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

Освен това: v2.5 е деклариран като javax.servlet:servlet-api:2.5, а версия v3.0.1 е деклариран като javax.servlet:javax.servlet-api:3.0.1, така че има разлика.

Ще бъде ли проблем за 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 обработва дублиращи се класове в classpath (вярвам, че първият намерен печели) и как Maven конструира classpath като начало.   -  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) изброява сървлети v2.5 като зависимост; и след това, ако стартирам същата команда отново, виждам само зависимост от 2.5.

Следователно можем да кажем, че предоставените зависимости не са прозрачни или експортирани.

person igr    schedule 14.05.2013