Maven依赖管理(maven依赖管理算法)

  本篇文章为你整理了Maven依赖管理(maven依赖管理算法)的详细内容,包含有maven依赖管理dependencymangemenr maven依赖管理算法 maven依赖管理有哪两种方式 maven依赖范围有哪些 Maven依赖管理,希望能帮助你了解 Maven依赖管理。

  此时三个项目的依赖关系如图所示,三个项目分别依赖了不同版本的log4j。

  现在我们构造这样一种情况,project3依赖log4j和junit,project2依赖log4j和project3,maven配置如下:

  

 !--项目2-- 

 

   groupId com.leo /groupId

   artifactId project2 /artifactId

   version 1.0-SNAPSHOT /version

   dependencies

   dependency

   groupId log4j /groupId

   artifactId log4j /artifactId

   version 1.2.13 /version

   /dependency

   dependency

   groupId com.leo /groupId

   artifactId project3 /artifactId

   version 1.0-SNAPSHOT /version

   /dependency

   /dependencies

   !--项目3--

   groupId com.leo /groupId

   artifactId project3 /artifactId

   version 1.0-SNAPSHOT /version

   dependencies

   dependency

   groupId log4j /groupId

   artifactId log4j /artifactId

   version 1.2.14 /version

   /dependency

   dependency

   groupId junit /groupId

   artifactId junit /artifactId

   version 4.12 /version

   /dependency

   /dependencies

  

 

  此时project2和project3的依赖关系如图:

  此时project2的依赖关系中出现了project3以及project3所依赖的包。对于project2来说,此时不光可以使用project3,也可以使用project3所以来的junit包。

  同时我们注意到,project3依赖了1.2.14版本的log4j,这与project2本身所依赖的1.2.13版本冲突了。

  此时Maven会使用如下3个规则来选择哪个包生效:

  依赖层级浅的包会覆盖依赖层级深的包。(示例中project2的log4j 1.2.13版本的依赖层级为1,1.2.14的依赖层级为2,因此第一层的版本生效)

  同层依赖中,先声明的包版本生效。

  同pom.xml文件中,后声明的版本生效。

  如果不希望别人在依赖我的包时知道我的包依赖了哪些其他的包,那么可以在引用依赖时将其标注为 optional true /optional ,这样别人在使用这个包时,就不会看到这个包依赖的包。

  

 !--项目2-- 

 

   groupId com.leo /groupId

   artifactId project2 /artifactId

   version 1.0-SNAPSHOT /version

   dependencies

   dependency

   groupId log4j /groupId

   artifactId log4j /artifactId

   version 1.2.13 /version

   /dependency

   dependency

   groupId com.leo /groupId

   artifactId project3 /artifactId

   version 1.0-SNAPSHOT /version

   /dependency

   /dependencies

   !--项目3--

   groupId com.leo /groupId

   artifactId project3 /artifactId

   version 1.0-SNAPSHOT /version

   dependencies

   dependency

   groupId log4j /groupId

   artifactId log4j /artifactId

   version 1.2.14 /version

   /dependency

   dependency

   groupId junit /groupId

   artifactId junit /artifactId

   version 4.12 /version

   optional true /optional

   /dependency

   /dependencies

  

 

  这样配置后,依赖关系如下图所示

  可以看到在project2中是无法看到project3所依赖的junit包的。当然也就无法通过依赖传递的方式使用到junit包。

  当我们引用别人的包时,别人的包中某些依赖我们不想引入自己的项目,那我们可以使用如下方式排除间接依赖的包。

  

 !--项目2-- 

 

   groupId com.leo /groupId

   artifactId project2 /artifactId

   version 1.0-SNAPSHOT /version

   dependencies

   dependency

   groupId log4j /groupId

   artifactId log4j /artifactId

   version 1.2.13 /version

   /dependency

   dependency

   groupId com.leo /groupId

   artifactId project3 /artifactId

   version 1.0-SNAPSHOT /version

   !--排除不想依赖的包--

   exclusions

   exclusion

   groupId log4j /groupId

   artifactId log4j /artifactId

   /exclusion

   /exclusions

   /dependency

   /dependencies

   !--项目3--

   groupId com.leo /groupId

   artifactId project3 /artifactId

   version 1.0-SNAPSHOT /version

   dependencies

   dependency

   groupId log4j /groupId

   artifactId log4j /artifactId

   version 1.2.14 /version

   /dependency

   dependency

   groupId junit /groupId

   artifactId junit /artifactId

   version 4.12 /version

   /dependency

   /dependencies

  

 

  如此配置后的依赖关系如图:

  可以看到project2中没有引入project3所依赖的log4j。

  引入依赖时,可以指定依赖包的生效范围

  
provided解释:例如,我们本地开发时使用了servlet-api 3.0版本进行调测,但当我们要把代码部署到服务器的tomcat中时,服务器的tomcat不支持3.0版本的servlet-api,它自带了自己的版本。如果我们把3.0版本打包进去,由于3.0版本会先加载,就导致在服务器的tomcat中无法运行。

  runtime解释:jdbc平时我们在使用的时候,加载driver都是通过字符串的形式,在代码中并没有真正引用过driver的内容,因此开发时可以不用引入需要依赖的driver,只要打包时把driver打进去就行了。

  依赖范围的传递性

  以上就是Maven依赖管理(maven依赖管理算法)的详细内容,想要了解更多 Maven依赖管理的内容,请持续关注盛行IT软件开发工作室。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: