Maven的依赖-创新互联

1、Maven的依赖

Maven的依赖通过dependencis元素来配置依赖,这是Maven最强大的特性之一。它支持传递性依赖。

创新互联公司专业为企业提供奎屯网站建设、奎屯做网站、奎屯网站设计、奎屯网站制作等企业网站建设、网页设计与制作、奎屯企业网站模板建站服务,10余年奎屯做网站经验,不只是建网站,更提供有价值的思路和整体网络服务。

1.1 添加依赖

在Maven中需要使用在dependencies中定义一个或者多个dependency元素,来声明项目的一个或者多个依赖。
每个依赖元素dependency包括:
Maven的依赖
例如:为项目添加junit测试的jar包,可以按如下方式定义

      4.0.0      com.fz      ShiroTest      war      0.0.1-SNAPSHOT      ShiroTest Maven Webapp       http://maven.apache.org                               junit              junit              4.11                            test                 

1.2 依赖范围(sope)

        
依赖范围与classpath的关系
依赖范围Scope对于编译classpath有效对于测试classpath有效对于运行时classpath有效例子
compileYYYspring-core
testYJUnit
providedYYservlet-api
runtimeYYJDBC驱动实现
systemYY本地的,Maven仓库之外的类库文件

1.3 依赖的传递性

在Maven中一个依赖不仅仅是一个JAR。它是一个POM文件,这个POM可能也声明了对其它构件的依赖。这些依赖的依赖叫做传递性依赖
所谓传递性依赖就是: 如果项目A依赖于项目B,项目B自身依赖于项目C,那么项目A它也依赖于项目C的依赖。
这种依赖是基于compile这个范围进行依赖
假如你的项目中需要依赖一个A库,这个A库自身又依赖了3个其它库。当你在dependencies中配置了A库的依赖的时候,则Maven会自动依赖3个其他库。不用你再自己去依赖了。就像Spring和Hibernate一样。你配置的时候,只需要配置Spring和Hibernate即可。
Maven在下载相应依赖的jar的时候,还会下载该jar的pom文件。这个文件对于传递性依赖特别重要。
这个pom文件跟我们现在编写的pom.xml文件没太大区别,打开后其实也是一样。
如下是hibernate-core-4.3.10.Final.jar的pom文件(hibernate-core-4.3.10.Final.pom)

  4.0.0  org.hibernate  hibernate-core  4.3.10.Final            org.jboss.logging      jboss-logging      3.1.3.GA      compile              org.jboss.logging      jboss-logging-annotations      1.2.0.Beta1      compile              org.jboss.spec.javax.transaction      jboss-transaction-api_1.2_spec      1.0.0.Final      compile              dom4j      dom4j      1.6.1      compile            Core Hibernate O/RM functionality  The core O/RM functionality as provided by Hibernate  http://hibernate.org      Hibernate.org    http://hibernate.org        jira    https://hibernate.atlassian.net/browse/HHH        http://github.com/hibernate/hibernate-orm    scm:git:http://github.com/hibernate/hibernate-orm.git    scm:git:git@github.com:hibernate/hibernate-orm.git              GNU Lesser General Public License      http://www.gnu.org/licenses/lgpl-2.1.html      See discussion at http://hibernate.org/license for more details.      repo                  hibernate-team      The Hibernate Development Team      Hibernate.org      http://hibernate.org      

可以看到hibernate-core-4.3.10.Final.pom文件中已经定义了hibernate-core-4.3.10.jar自己所依赖的jar包了。

1.2.1 依赖传递性的冲突问题
1. 第一种情况

Maven的依赖
项目A依赖于项目B1.0 ,项目C依赖于项目B1.1。项目D同时依赖于项目A和C,那么哪一个写在前面就先依赖哪个版本。
也就是说到底依赖于log4j1.2.17还是log4j1.2.16,决定于它的dependency出现的先后顺序。
哪个依赖的顺序在前面就依赖哪个
可见上面user-core在user-log前面,而user-core的log4j是1.2.17。那么最终user-dao的log4j就是1.2.17版本
同理,如果换个位置。user-log在user-core的前面。

         com.fz.user        user-log        0.0.1-SNAPSHOT                com.fz.user        user-core        0.0.1-SNAPSHOT    

那么结果就是
Maven的依赖

2. 第二种情况

Maven的依赖
如果路径的长短不一致,就选择最小路径
user-dao中的log4j路径:user-dao=====>user-core=====>log4j1.2.17
user-log中的log4j路径:user-log=====>log4j1.2.16
可见user-log的log4j路径要短一些,所以这里是1.2.16
Maven的依赖
如果这里把user-log换成user-core的话,那么user-core的log4j路径也是比user-dao的路径短。结果肯定是log4j1.2.17
Maven的依赖

假如我不想依赖user-core和user-log两个模块中的log4j呢?
那就自己再添加一个dependency试试。
Maven的依赖
可以看出Maven会优先依赖自己定义的那个dependeny

1.2.2 通过exclusions元素排除不想要的传递性依赖

以上的问题可以通过更改相应的顺序来确定依赖的版本,当然也可以使用依赖的排除功能。来精确的控制所使用的版本。
排除依赖:就是将该模块中的**jar包给移除掉。
例如:以下的情况肯定是使用了user-log的log4j版本,因为它的顺序在前面。假如现在不想通过调整顺序来改版本那就可以使用排除依赖。
Maven的依赖
排除依赖是在dependency元素下的exclusions元素,例如:我们把user-log中的log4j排除掉,那就只能去user-core中找log4j了
Maven的依赖
可以看出虽然user-log写在了上面,但是通过exclusion还是会把该模块中的log4j给排除掉。

1.2.3 依赖传递性冲突问题解决办法总结
  1. 通过调整dependency的顺序来解决:哪个依赖的顺序在前面就依赖哪个

  2. 自己添加一个dependeny来解决:因为该路径是最小的。

  3. 通过exclusions元素排除不想要的传递性依赖

1.4 依赖版本的界限

在依赖某个项目的时候,你可以不必指定特定的某个版本。也可以指定一个版本范围
(,) 不包含
[,] 包含
例如:依赖一个Junit的大于等于3.8 但是小于4.0 的版本

    junit    junit    [3.8,4.0)

另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


新闻名称:Maven的依赖-创新互联
标题URL:http://myzitong.com/article/dsppcc.html