`

(转)maven中的dependencyManagement和dependencies区别

 
阅读更多
比如有的依赖的<scope>是写在子项目中的 <dependencies> 下的<dependency> 标签中,
而有的依赖的<scope>是写在父项目中的<dependencyManagement> 中 。
我知道前一种写法是对的,而后一种写法却不知道对不对了,从网上查了下,没有找到非常确切的答案,于是自己验证了一把。
把验证过程给大家说下,大家也可以自己练手。
首先新建三个项目,Parent作为父项目、projectA、projectB作为子项目。
在父项目Parent中依赖项如下:
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
在子项目projectA、projectB中没有写任何依赖,在projectA 下运行命令 mvn help:effective-pom,会发现A下面有 junit 4.8.1的依赖。
如果我把 父项目Parent 中的依赖修改如下:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
</dependencyManagement>
子项目ProjectA、projectB下面还是没有任何依赖项,在projectA 下运行命令 mvn help:effective-pom,会发现A下面 没有 junit 4.8.1的依赖。
如果我在projectA 下添加junit的依赖:
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
</dependencies>
再在projectA 下运行命令 mvn help:effective-pom,会发现A下面有了 junit 4.8.1的依赖,并且scope为 test。
那么经过验证,scope写在子项目中的<dependencies> 下的<dependency>中,或是写在父项目中的<dependencyManagement>中,都是可以的。
但有一点需要注意,dependencies 和 dependencyManagement 的区别在于:
前者,即使在子项目中不写该依赖项,那么子项目仍然会从父项目中继承该依赖项。
后者,如果在子项目中不写该依赖项,那么子项目中是不会从父项目继承该依赖项的;只有在子项目中写了该依赖项,才会从父项目中继承该项,并且version 和 scope 都读取自 父pom。


--------------------------------

可以在父模块中配置如下:

<dependencyManagement>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactid>junit</artifactId>
<version>4.8.2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactid>log4j</artifactId>
<version>1.2.16</version>
</dependency>
</dependencies>
</dependencyManagement>
这段配置不会给任何子模块引入依赖,但如果某个子模块需要使用JUnit和Log4j的时候,我们就可以简化依赖配置成这样:

<dependency>
<groupId>junit</groupId>
<artifactid>junit</artifactId>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactid>log4j</artifactId>
</dependency>
现在只需要groupId和artifactId,其它元素如version和scope都能通过继承父POM的dependencyManagement得到,如果有依赖配置了exclusions,那节省的代码就更加可观。但重点不在这,重点在于现在能够保证所有模块使用的JUnit和Log4j依赖配置是一致的。而且子模块仍然可以按需引入依赖,如果我不配置dependency,父模块中dependencyManagement下的spring-aop依赖不会对我产生任何影响。

也许你已经意识到了,在多模块Maven项目中,dependencyManagement几乎是必不可少的,因为只有它是才能够有效地帮我们维护依赖一致性。

本来关于dependencyManagement我想介绍的也差不多了,但几天前和Sunng的一次讨论让我有了更多的内容分享。那就是在使用dependencyManagement的时候,我们可以不从父模块继承,而是使用特殊的import scope依赖。Sunng将其列为自己的Maven Recipe #0,我再简单介绍下。

我们知道Maven的继承和Java的继承一样,是无法实现多重继承的,如果10个、20个甚至更多模块继承自同一个模块,那么按照我们之前的做法,这个父模块的dependencyManagement会包含大量的依赖。如果你想把这些依赖分类以更清晰的管理,那就不可能了,import scope依赖能解决这个问题。你可以把dependencyManagement放到单独的专门用来管理依赖的POM中,然后在需要使用依赖的模块中通过import scope依赖,就可以引入dependencyManagement。例如可以写这样一个用于依赖管理的POM:

<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.juvenxu.sample</groupId>
<artifactId>sample-dependency-infrastructure</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactid>junit</artifactId>
<version>4.8.2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactid>log4j</artifactId>
<version>1.2.16</version>
</dependency>
</dependencies>
</dependencyManagement>
</project>
然后我就可以通过非继承的方式来引入这段依赖管理配置:

<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.juvenxu.sample</groupId>
<artifactid>sample-dependency-infrastructure</artifactId>
<version>1.0-SNAPSHOT</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>

<dependency>
<groupId>junit</groupId>
<artifactid>junit</artifactId>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactid>log4j</artifactId>
</dependency>
这样,父模块的POM就会非常干净,由专门的packaging为pom的POM来管理依赖,也契合的面向对象设计中的单一职责原则。此外,我们还能够创建多个这样的依赖管理POM,以更细化的方式管理依赖。这种做法与面向对象设计中使用组合而非继承也有点相似的味道。
分享到:
评论

相关推荐

    dependencyManagement与dependencies区别.docx

    为了项目的正确运行,必须让所有的子模块使用依赖项的统一版本,必须...Maven会沿着父子层次向上走,直到找到一个拥有dependencyManagement元素的项目,然后它就会使用在这个dependencyManagement元素中指定的版本号。

    Apache Maven Dependency Management

    If you are working with Java or Java EE projects and you want to take advantage of Maven dependency management, then this book is ideal for you. This book is also particularly useful if you are a ...

    Maven dependencies与dependencyManagement的区别详解

    主要介绍了Maven dependencies与dependencyManagement的区别详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    Maven 实战问题和最佳实践.pdf

    1、dependencies 和 dependencyManagement,plugins 和 pluginManagement 有什么区别? dependencyManagement 是表⽰依赖 jar 包的声明,即你在项⽬中的 dependencyManagement 下声明了依赖,maven 不会加 载该依赖...

    Gradle.Dependency.Management.1784392782

    Learn how to use Gradle's powerful dependency management through extensive code samples, and discover how to define, customize, and deploy dependencies About This Book Be in total control of your ...

    maven-dependency-analyzer:Apache Maven依赖性分析器

    这样,您可以确保您不会浪费时间在Apache Maven范围之外的东西上。 假设您的问题不存在,请提交该问题的票证。 清楚地描述问题,包括在出现错误时重现的步骤。 确保填写您知道存在问题的最早版本。 在GitHub上...

    使用Maven管理进行多模块开发案例

    &lt;dependencyManagement&gt; &lt;dependencies&gt; &lt;dependency&gt; &lt;groupId&gt;javax.servlet&lt;/groupId&gt; &lt;artifactId&gt;servlet-api&lt;/artifactId&gt; &lt;version&gt;2.5&lt;/version&gt; &lt;scope&gt;provided&lt;/scope&gt; &lt;/dependency&gt; ...

    Maven权威指南 很精典的学习教程,比ANT更好用

    Maven依赖管理 (Dependency Management) 3.5.6. 站点生成和报告 (Site Generation and Reporting) 3.6. 小结 4. 定制一个Maven项目 4.1. 介绍 4.1.1. 下载本章样例 4.2. 定义Simple Weather项目 4.2.1...

    springboot-rest,cors跨域

    在Maven项目中,您将在&lt;dependencyManagement /&gt;POM 的部分中声明此依赖项,如下所示: 示例1.使用Spring Data版本系列BOM &lt;dependencyManagement&gt; &lt;dependencies&gt; &lt;dependency&gt; &lt;groupId&gt;org.springframework....

    maven-ant-tasks-2.1.3-src

    Dependency management - including transitive dependencies, scope recognition and SNAPSHOT handling Artifact deployment - deployment to a Maven repository (file integrated, other with extensions) POM ...

    maven-ant-tasks-2.1.3

    Dependency management - including transitive dependencies, scope recognition and SNAPSHOT handling Artifact deployment - deployment to a Maven repository (file integrated, other with extensions) POM ...

    aliyun-spring-boot:用于Aliyun服务的Spring Boot Starters

    &lt; dependencyManagement&gt; &lt; dependencies&gt; &lt; dependency&gt; &lt; groupId&gt;com.alibaba.cloud&lt;/ groupId&gt; &lt; artifactId&gt;aliyun-spring-boot-dependencies &lt; version&gt;1.0.0 &lt; type&gt;pom &lt; scope&gt;import &lt;/ ...

    Java人才

    Google Talent Solution Java客户端Java惯用客户端。快速开始如果您将Maven与一起使用,请将其添加到pom.xml文件中&lt; dependencyManagement&gt; &lt; dependencies&gt; &lt; dependency&gt; &lt; groupId&gt;...&lt;/ dependencies&gt;&lt;/ dependency...

    entando-core-bom

    在您的Maven POM的dependencyManagement部分中,插入此依赖关系的最新版本,但具有“ import”作用域和“ pom”类型: &lt;dependencyManagement&gt; &lt;dependencies&gt; &lt;dependency&gt; &lt;groupId&gt;org.entando&lt;/group

    Java视觉

    如果您将Maven与一起使用,请将其添加到pom.xml文件中 &lt; dependencyManagement&gt; &lt; dependencies&gt; &lt; dependency&gt; &lt; groupId&gt;com.google.cloud&lt;/ groupId&gt; &lt; artifactId&gt;libraries-bom &lt; version&gt;16.4.0 &lt; type&gt;...

    java-dataproc

    Google Dataproc Java客户端Java惯用客户端。快速开始如果您将Maven与一起使用,请将其添加到pom.xml文件中。 &lt; dependencyManagement&gt; &lt; dependencies&gt; &lt; ...&lt;/ dependencies&gt;&lt;/ dependencyManagement&gt;&lt; depen

    java-spanner

    如果您将Maven与一起使用,请将其添加到pom.xml文件中。 &lt; dependencyManagement&gt; &lt; dependencies&gt; &lt; dependency&gt; &lt; groupId&gt;com.google.cloud&lt;/ groupId&gt; &lt; artifactId&gt;libraries-bom &lt; version&gt;19.0.0 ...

    java推荐

    适用于Java的Google Recommender客户端Java惯用的客户端。快速开始如果您将Maven与一起使用,请将其添加到pom.xml文件中。 &lt; dependencyManagement&gt; &lt; dependencies&gt; &lt; ...&lt;/ dependencies&gt;&lt;/ dependencyManagement&gt;

    java-storage

    如果您将Maven与一起使用,请将其添加到pom.xml文件中。 &lt; dependencyManagement&gt; &lt; dependencies&gt; &lt; dependency&gt; &lt; groupId&gt;com.google.cloud&lt;/ groupId&gt; &lt; artifactId&gt;libraries-bom &lt; version&gt;19.0.0 ...

Global site tag (gtag.js) - Google Analytics