我在我的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的依赖关系?
答案 0 :(得分:1)
事实上,根据官方Maven Dependency Mediation,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
部分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