2016-09-07 87 views
2

我已经加入vaadin-client-compiler依赖在我vaadin应用POM一个provided范围依赖。传递依赖从提供的范围来依赖

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

但是,我发现我的WEB-INF/lib目录内vaadin-client-compiler(公地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范围依赖的依赖,为什么就成了我的web应用程序的依赖呢?

+0

瓶子被提供在最终的包装? – VinayVeluri

+0

@VinayVeluri,是的。正如我所提到的,在'WEB-INF/lib'中可用的依赖jar包。 –

+0

你也许使它'provided'之前建立自己的Web应用程序?如果您尝试运行'MVN清洁package'会发生什么,它STIL在你的lib目录中显示? – Morfic

回答

1

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

  • 传递依赖于compile范围>将被提取为provided范围
  • provided范围内的传递依赖关系忽略
  • Transitiv在runtime范围ë依赖性>将在test范围中获取作为provided范围
  • 传递依赖>忽略

因此,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也将有助于
+0

@LahiruChandima你解决这个问题?这个答案有帮助吗? –