maven中dependency的属性(依赖)配置
groupId,artfactId,version,type,classifier,scope,systemPath,exclusions,optional 是 maven的9种依赖属性,
其中groupId,artfactId,version是三个基本的依赖坐标,不可缺少。
groupId------包名(⼀般为域名的反写)。
artfactId------项⽬名。
version-------版本。
----------------------------------------------------------------------------------
牛奶的营养价值type----------依赖的类型,jar或者war(默认为jar,表⽰依赖的是⼀个jar包),另外当type表⽰为<type>pom.lastUpdated</type> 这种属性时,表⽰只将jar的描述信息加载了进来,实际的jar包并未导⼊。
classifier----通常是⽤于从同⼀POM构建的拥有不同内容的构件,可选属性,可以是任意的字符串。对附加了classifier属性的包,如果不加上classifier,maven是找不到这个包的,⽐如下⾯这个依赖:
<dependency>
<groupId>net.sf.json-lib</groupId>
<artifactId>json-lib</artifactId>
<version>2.2.2</version>
</dependency>
然后再去中央仓库查看
寒号鸟读后感
发现中央仓库中并没有json-lib-2.2.2.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>
这样就可以找到json-lib-2.2.2-jdk15.jar这个包
classifier不仅可以指明版本号,可以指明同⼀项⽬的不同组成部分,⽐如:源⽂件,javadoc,类⽂件等。在上⾯的图中你会发现还有⼀些json-lib-2.2.2-jdk15-javadoc.jar包和json-lib-2.2.2-jdk15-source.jar包,如果你需要的是javadoc,在XML⽂档中就可以这样写:
<dependency>
<groupId>net.sf.json-lib</groupId>
<artifactId>json-lib</artifactId>
<version>2.2.2</version>
<classifier>jdk15-javadoc</classifier>
</dependency>
同理,如果你需要的时候source包就可以把classifier写成 jdk15-source 。
scope-----依赖作⽤的范围,指通过POM加载进来的包,作⽤的范围,范围⼀共有:编译时,运⾏时,测试时,
scope⼀共有compile,runtime,test,system,provided 5种属性值,compile为其默认值,其中:
compile表⽰在所有范围此jar都⽣效,
test表⽰只在测试范围此jar⽣效,例如Junit(默认compile,不会报错,扩展了test),
runtime表⽰在测试和运⾏时此jar⽣效,例如JDBC驱动(默认compile,不会报错,扩展了runtime),我们在编译时是没有⽤到这个包的,只在测试和运⾏时会使⽤到,
金星舞蹈视频provided表⽰在编译和测试时此jar⽣效,例如rvlet-api,jsp-api,这个的provided必须填写,不能使⽤compile,原因是:
琳琅满目是什么意思
我们在eclispe⾥创建web项⽬时,eclip为我们添加了这两个jar包,离开了eclispe之后,到Tomcat中Tomcat⼜会为我们提供这两个包,所以⼀直不会报错,但是在我们创建maven项⽬时,我们就不是web项⽬了,所以eclispe不会为我们添加这两个jar包,就需要我们通过maven来添加,但是如果设置了compile,在Tomcat中运⾏时,就会与Tomcat中提供的这两个包产⽣冲突,所以要设置为provided,
system表⽰我们⼿动添加的包,不属于maven仓库,属于别的类库的jar包,只在编译和测试期⽣效,运⾏时⽆效,⼀般不⽤,使⽤时,需要配合下⾯的systemPath使⽤。
systemPath--为并⾮依赖maven的包指明路径。
在项⽬中创建⼀个lib作为⼿动导⼊的jar包存储位置,
然后再l⽂件中添加依赖,
洪湖公园badir表⽰根⽬录。
exclusions---排除传递依赖,解决jar冲突问题,
依赖传递的意思是项⽬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会先根据第⼀原则判断,若路径相等,再根据第⼆原则判断
但是我们还是使⽤exclusions来配置更加合理,我们使⽤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⽂件当中的内容