Транзитивные зависимости, исходящие из предоставленной зависимости области действия

Я добавил зависимость vaadin-client-compiler в качестве зависимости области действия provided в моем приложении vaadin pom.

Как я читал, зависимость provided не является транзитивной, поэтому зависимости vaadin-client-compiler должны стать зависимостями моего веб-приложения.

Но я обнаружил зависимости vaadin-client-compiler (commons-lang3-3.1.jar) внутри моего каталога WEB-INF/lib.

Кроме того, эти зависимости также показаны в выводе mvn dependency:tree.

[INFO] |  +- javax.validation:validation-api:jar:1.0.0.GA:compile
[INFO] |  \- javax.validation:validation-api:jar:sources:1.0.0.GA:compile
[INFO] +- com.vaadin:vaadin-client-compiler:jar:7.6.4:provided
[INFO] |  +- com.vaadin:vaadin-sass-compiler:jar:0.9.13:compile
[INFO] |  |  \- com.yahoo.platform.yui:yuicompressor:jar:2.4.8:compile
[INFO] |  |     \- rhino:js:jar:1.7R2:compile
[INFO] |  +- commons-collections:commons-collections:jar:3.2.2:compile
................................................
.................................................
[INFO] |  +- commons-codec:commons-codec:jar:1.8:compile
[INFO] |  +- commons-io:commons-io:jar:2.4:compile
[INFO] |  +- org.apache.commons:commons-lang3:jar:3.1:compile

Вопрос. Почему зависимости области видимости provided стали зависимостями моего веб-приложения?


person Lahiru Chandima    schedule 07.09.2016    source источник
comment
Баночка доступна в окончательной упаковке?   -  person VinayVeluri    schedule 07.09.2016
comment
@VinayVeluri, да. Как я уже упоминал, файлы зависимостей, доступные в WEB-INF/lib.   -  person Lahiru Chandima    schedule 07.09.2016
comment
Возможно, вы создали свое веб-приложение, прежде чем сделать его provided? Что произойдет, если вы попытаетесь запустить mvn clean package, он все еще отображается в вашем каталоге lib?   -  person Morfic    schedule 07.09.2016
comment
@Morfic, перед проверкой я сделал чистую сборку.   -  person Lahiru Chandima    schedule 07.09.2016


Ответы (2)


Действительно, согласно официальному Maven Dependency Mediation, provided Scope введет свои транзитивные зависимости следующим образом:

  • Транзитивные зависимости в области compile > будут выбраны как область provided
  • Переходные зависимости в области provided > игнорируются
  • Транзитивные зависимости в области runtime > будут выбраны как область provided
  • Переходные зависимости в области test > игнорируются

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

Добавление следующей зависимости в пример проекта:

<dependencies>
    <dependency>
        <groupId>com.vaadin</groupId>
        <artifactId>vaadin-client-compiler</artifactId>
        <version>7.6.4</version>
        <scope>provided</scope>
    </dependency>
</dependencies>

Приведет к следующему, выполнив:

mvn dependency:tree -Dincludes=com.vaadin

У нас будет как часть вывода:

[INFO] \- com.vaadin:vaadin-client-compiler:jar:7.6.4:provided
[INFO]    +- com.vaadin:vaadin-shared:jar:7.6.4:provided
[INFO]    +- com.vaadin:vaadin-server:jar:7.6.4:provided
[INFO]    +- com.vaadin:vaadin-client:jar:7.6.4:provided
[INFO]    +- com.vaadin:vaadin-sass-compiler:jar:0.9.13:provided
[INFO]    \- com.vaadin:vaadin-client-compiler-deps:jar:1.2.0:provided

Полностью соответствует документации.

Однако если мы добавим в файл pom.xml следующее:

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>com.vaadin</groupId>
            <artifactId>vaadin-server</artifactId>
            <version>7.6.4</version>
            <scope>compile</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

Примечание: мы переопределяем область действия одной из его транзитивных зависимостей на compile.

Повторно выполнив предыдущую команду, мы бы получили:

[INFO] \- com.vaadin:vaadin-client-compiler:jar:7.6.4:provided
[INFO]    +- com.vaadin:vaadin-shared:jar:7.6.4:compile
[INFO]    +- com.vaadin:vaadin-server:jar:7.6.4:compile
[INFO]    +- com.vaadin:vaadin-client:jar:7.6.4:provided
[INFO]    +- com.vaadin:vaadin-sass-compiler:jar:0.9.13:compile
[INFO]    \- com.vaadin:vaadin-client-compiler-deps:jar:1.2.0:provided

Это означает: транзитивная зависимость vaadin-server по-прежнему вводится vaadin-client-compiler, но ее область действия теперь равна compile в соответствии с управлением зависимостями.

Следовательно, вы должны:

  • Проверьте, определяет ли ваш pom.xml какой-либо раздел dependencyManagement
  • Проверьте, сделает ли это ваш родительский помпон или любой помпон в иерархии, выполнение mvn help:effective-pom -Doutput=full-pom.xml определенно поможет
  • Проверьте, не повлияет ли какой-либо активный профиль на сборку, также поможет выполнение mvn help:active-profiles
person A_Di-Matteo    schedule 07.09.2016
comment
@LahiruChandima, ты решил эту проблему? этот ответ помог? - person A_Di-Matteo; 12.09.2016
comment
Я думаю, что здесь нет управления зависимостями или поведения, специфичного для профиля. Это стандартный случай, также описанный здесь stackoverflow.com/q/55147019/1034782 и зарегистрированный в системе отслеживания проблем maven здесь issues.apache.org/jira/browse/MNG-6607 Возможно, это не ошибка, но, кажется, это нигде не задокументировано! - person Donatello; 13.03.2019

«Нетранзитивность» предоставленных зависимостей сложна. Это означает только то, что предоставленные зависимости ваших зависимостей не извлекаются. С другой стороны, зависимости компиляции предоставленных зависимостей извлекаются (как вы уже видели). Вся правда в таблице, приведенной в:

https://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html

person J Fabian Meier    schedule 07.09.2016