Maven与MyEclipse项目

新建一个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>



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值