2

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

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

但是,我vaadin-client-compiler在我的 WEB-INF/lib 目录中找到了 (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 的依赖?

4

2 回答 2

1

事实上,根据官方的Maven 依赖中介provided作用域将引入它的传递依赖,如下所示:

  • 范围 >中的传递依赖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也会有所帮助
于 2016-09-07T12:11:01.613 回答
0

提供的依赖项的“非传递性”很棘手。这仅意味着您的依赖项提供的依赖项不会被拉取。另一方面,提供的依赖项的编译依赖项被提取(正如您所经历的那样)。完整的真相如下表所示:

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

于 2016-09-07T12:06:39.240 回答