来自提供的范围依赖性的传递依赖性

时间:2016-09-07 11:54:12

标签: java maven vaadin dependency-management maven-dependency

我在我的vaadin应用程序pom中添加了vaadin-client-compiler依赖项作为provided范围依赖项。

正如我所读到的,provided依赖项不可传递,因此vaadin-client-compiler的依赖项应该成为我的webapp的依赖项。

但是,我在WEB-INF / lib目录中找到了vaadin-client-compiler(commons-lang3-3.1.jar)的依赖项。

此外,这些依赖关系也显示在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范围依赖关系的依赖关系成为我的webapp的依赖关系?

2 个答案:

答案 0 :(得分:1)

事实上,根据官方Maven Dependency Mediationprovided范围将带来其传递依赖性如下:

  • 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部分
  • 检查您的父pom或层次结构中的任何pom是否会这样做,执行mvn help:effective-pom -Doutput=full-pom.xml肯定有帮助
  • 检查是否有任何活动配置文件也会影响构建,执行mvn help:active-profiles也会有所帮助

答案 1 :(得分:0)

&#34;非传递性&#34;提供的依赖项是棘手的。它只表示不提取依赖项的提供依赖项。另一方面,提取所提供的依赖项的编译依赖项(正如您所经历的那样)。完整的事实如下表所示:

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