Maven与MyEclipse项目

来源:互联网 发布:文员office办公软件 编辑:程序博客网 时间:2024/05/21 01:32

新建一个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依赖了log4j2.4.16HelloFriend依赖了log4j2.4.14,但是MakeFriends是直接依赖HelloFriend的,MakeFriends间接依赖Hello,所以MakeFriendsHelloFriend比较近,选择HelloFriendlog4j继承。

第二个原则,路径长度相同,第一声明者优先,即在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>



原创粉丝点击