scope用于依赖范围控制,它管理哪些依赖在哪些classpath 中可用,哪些依赖包含在一个应用中. 它的取值列表如下:

关于为什么使用provided 引入 servlet-api,jsp-api的问题的澄清: 

         在eclispe里创建web项目时,eclipse为我们自动添加了这两个jar包,当离开了eclispe之后,将这个web项目发布到Tomcat中Tomcat在它的lib目录中又会为我们提供这两个包,所以一直不会报错,但是在eclipse中我们创建maven项目时,我们就不是web项目了,所以eclispe不会为我们添加这两个jar包,就需要我们通过maven来添加,但是如果对这两个 jar包设置scope为compile,在Tomcat中运行时,就会与Tomcat中提供的这两个包产生冲突,所以要设置为provided. 

type:  用于声明依赖的类型
 

classifier: 用于从同一POM构建的拥有不同内容的构件,可选属性,可以是任意的字符串。对附加了classifier属性的包,如果不加上classifier,maven是找不到这个包的.  例如下面的依赖:

在maven仓库中没有这个 json-lib-2.2.2.jar的文件,只有json-lib-2.2.2-jdk15.jar的包,这是不同版本的json-lib-2.2.2.jar. 这个时候classifier就可以指明所想要版本。

<dependency>  
     <groupId>net.sf.json-lib</groupId>   
     <artifactId>json-lib</artifactId>   
     <version>2.2.2</version>
     <classifier>jdk15</classifier>
</dependency> 

传递依赖

      它的的意思是项目A依赖项目B,项目B依赖项目C,在使用项目A时,就会加载项目B,这样传递依赖就会把项目C,D,E等等加载进来。其中B是A的直接依赖,C是A的间接依赖

     例如:A项目依赖B(版本为1.1),C项目也依赖B(版本为1.2),假如现在有一个项目同时依赖项目A和项目B,那么他就会导入两个版本的B,由于B的两个版本不同,这里就会导致冲突,这个时候就需要exclusions来解决冲突,不过maven也有一个机制会避免两个都加载进去,

下面先介绍maven的依赖调节原则:

1,第一原则:路径近者优先原则

                       A→B→C→X(1.1)

                       D→E→X(1.2)

                       使用X(1.2),因为其路径更近

2,第二原则:第一声明者优先原则

                       A→B→X(1.1)

                       C→D→X(1.2)

                      使用X(1.1),因为其先声明

maven会先根据第一原则判断,若路径相等,再根据第二原则判断. 

下面使用spring bean 和 struts2 spring plugin来举个例子说明这个问题并使用exclusions来解决这个问题(spring bean 和 struts2 spring plugin都依赖spring-core但是版本不一样)
 

先把两个jar包在本地仓库中找到

首先我们还是看看maven自己的解决方案:

由于是先将spring-beans导入所以使用的是spring-core(3.2)

由于是先将struts2-spring-plugin导入所以使用的是spring-core(3.0.5)

上面是路径相同的,接下来的是路径不同的,我建立了一个A项目和B项目,其中A项目中有jsoup-1.11.2,B项目是jsoup-1.11.1,

由于1.11.2版本的是A→jsoup-1.11.2.jar ,1.11.1版本的是A→B→jsoup.1.11.1.jar,所以最后采用jsoup-1.11.2.jar版本。

下面使用exclusions来解决问题:

这是未使用过exclusions过的xml文件当中的内容

下面即使struts2-spring-plugin先导入,也要使用spring-core(3.2),所以需要右键点击struts2-spring-plugin,然后解除依赖

然后会发现

他将两个依赖都解除了,这里手动将第二个的解除依赖删掉就可以

最后使用的是3.2版本的spring-core

optional:  标记依赖是否可传递,默认值false.

比如上面的项目A和项目B,

现在查看A

我现在在项目B中标注jsoup为true

再去A中查看

发现B中没有jsoup了

optional可以用来减少项目之间jar包的冲突。

参考:  http://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html
https://blog.csdn.net/VVVZCS/article/details/81625547?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.add_param_isCf&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.add_param_isCf

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐