新建一个maven工程,MakeFriends,这个类用到了HelloFriend中的方法,所以MakeFriends类依赖于HelloFriend。所以需要在pom.xml中定义依赖。我们的MakeFriends类需要测试,在test文件夹下建立一个测试程序,这个程序依赖于junit,所以在pom中也要有junit的依赖配置,注意版本一定要配置对,因为这是坐标,坐标不对找不到对应的junit。
工程下的MavenDependencies文件夹是存放这个工程的依赖文件的地方。
为什么一个工程只依赖于junit,不依赖别的,但是依赖文件多了一个hamcrest-core-1.1.jar呢?因为junit依赖于hamcrest-core-1.1.jar,所以现在相当于依赖传递了,所有的依赖链上的文件都会被拿到这里。
情景:当前工程组成为:Hello,HelloFriend,MakeFriends,依赖关系为,Hello依赖junit,HelloFriend依赖于junit,Hello,MakeFriends依赖于junit,HelloFriend,那么Hello的Maven Dependencies下面有junit的jar,HelloFriend的Maven Dependencies下会有Hello和junit,MakeFriends会有Hello,HelloFriend,junit。
操作:现在Hello又依赖了log4j的2.4.16版本,他的Maven Dependencies就多了一个log4j的文件,那么由于依赖关系,HelloFriend的Maven Dependencies下也多了log4j的2.4.16版本,但现在又在HelloFriend的pom.xml中定义依赖log4j的2.4.14版本,会出现什么情况呢?
结果:HelloFriend的Maven Dependencies下有一个log4j的2.4.14版本,没有log4j的2.4.16版本,后面的MakeFriends的Maven Dependencies里面也有一个log4j的2.4.14版本。
对于MakeFriends来说,可以继承两个版本的log4j,当可继承的文件出现冲突的时候(比如版本冲突),为什么选择了log4j的2.4.14版本呢?这是第一个原则,路径长度不同,近者优先原则。即:Hello依赖了log4j的2.4.16,HelloFriend依赖了log4j的2.4.14,但是MakeFriends是直接依赖HelloFriend的,MakeFriends间接依赖Hello,所以MakeFriends离HelloFriend比较近,选择HelloFriend的log4j继承。
第二个原则,路径长度相同,第一声明者优先,即在pom.xml文件中靠前位置声明的优先。
Maven Dependencies中文件的传递受作用域scope影响,
以刚才的Hello和HelloFriend的log4j说明。
因为HelloFriend直接依赖Hello,而间接依赖log4j,在HelloFriend的pom.xml中配置的直接依赖的Hello的范围是compile,所以定位到第一行,再根据间接依赖的log4j在Hello中的配置,作用域为runtime,所以定位到第四列,第一行和第四列的交叉为runtime,所以传递到HelloFriend的log4j的<scope>作用域为runtime。
聚合与继承:
这些pom.xml中有很多重复的代码,重复代码一多,就要向上抽取,像java那样,抽取出一个父类。
因为之前的Hello,HelloFriend,MakeFriends里的pom.xml的重复代码太多,所以抽取出一个父类,其所有子类都继承这个pom.xml。
再建立一个maven工程,在子类中通过<parent>标签声明他的父类。
这是父类中的代码:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>cn.itcast.maven</groupId>
<artifactId>Parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging> //这里必须是pom
<name>Parent</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<modules>
<module>../Hello</module>
<module>../HelloFriend</module>
<module>../MakeFriends</module>
<module>../web</module>
</modules>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.9</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>cn.itcast.maven</groupId>
<artifactId>Hello</artifactId>
<version>0.0.1-SNAPSHOT</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>cn.itcast.maven</groupId>
<artifactId>HelloFriend</artifactId>
<version>0.0.1-SNAPSHOT</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>cn.itcast.maven</groupId>
<artifactId>MakeFriends</artifactId>
<version>0.0.1-SNAPSHOT</version>
<scope>compile</scope>
</dependency>
</dependencies>
</dependencyManagement>
<distributionManagement>
<repository>
<id>rd5</id>
<name>rd5</name>
<url>http://192.168.3.100:8080/nexus-2.1.2/content/repositories/rd5/</url>
</repository>
</distributionManagement>
</project>
子类中的代码:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<artifactId>Hello</artifactId>
<parent>
<groupId>cn.itcast.maven</groupId>
<artifactId>Parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
<relativePath>../Parent/pom.xml</relativePath> //相对路径,从当前pom所在的路径 去找父类pom所在的路径,..表示返回上一级
</parent>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
<dependency>
<groupId>cn.itcast.cos</groupId>
<artifactId>cos_wlp</artifactId>
<version>2.0</version>
</dependency>
</dependencies>
</project>