文档章节

maven-依赖管理最佳实践

haoran_10
 haoran_10
发布于 2016/07/15 16:38
字数 1143
阅读 131
收藏 3

钉钉、微博极速扩容黑科技,点击观看阿里云弹性计算年度发布会!>>>

一般一个父pom项目下面常常有好几个子pom项目模块,而且几个子模块依赖的很多jar包,比如groupId/artifactid/version都是相同的,这样有三个弊端:

  1. 造成jar包重复依赖
  2. 造成版本号重复依赖
  3. 升级某个版本号时,要修改好几个子模块

 

一、在父模块中定义全部dependencies

在父模块中配置dependencies,那样所有子模块都自动继承。

例如在父pom文件中定义好我们需要的全部jar:

 

<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>
 

 

这样子模块只要继承父模块就能直接使用这些jar包,不仅达到了依赖一致的目的,还省掉了大段代码。

 

然而:这么做是有些不妥的地方,例如某个子模块,比如A不需要父模块log4j的依赖,但也直接继承了,造成了jar包臃肿,多余依赖。

 

二、在父模块中定义全部dependencyManagement

我们需要一种在父模块中定义好全部的jar包依赖,而子模块需要哪一种指定哪一种,这样既做到了集中式配置,又做到了子模块需要什么配置什么的灵活性。

而dependencyManagement就可以做到。针对这个问题我们可以使用继承机制以及dependencyManagement元素就能解决这个问题。

dependencyManagement只会影响现有依赖的配置,但不会引入依赖。

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

<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>

  

不要的模块,就不需要引入,而dependencyManagement完美的做到了这点。

现在只需要groupId和artifactId,其它元素如version和scope都能通过继承父POM的dependencyManagement得到,如果有依赖配置了exclusions,那节省的代码就更加可观。

但重点不在这,重点在于现在能够保证所有模块使用的JUnit和Log4j依赖配置是一致的。而且子模块仍然可以按需引入依赖, 如果我不配置log4j

dependency,父模块中dependencyManagement下的log4j依赖不会对子模块产生任何影响。

 

然而,如果在父模块中引入了大量的jar包依赖,这个父模块的dependencyManagement就会包含大量的依赖,如果你想把这些依赖分类以更清晰的管理,那就不可能了。
 
 
三、使用import单独出dependencyManagement

此时为了应对父模块中引入了大量的jar包依赖造成父模块臃肿,我们需要一种可以把dependencyManagement放到外面去分开管理,这样很清晰很多,才能更好的管理更多的jar。

而import scope依赖能解决这个问题。

我们可以把dependencyManagement放到单独的专门用来管理依赖的POM中,然后在需要使用依赖的模块中通过import scope依赖,就可以引入dependencyManagement。

 

1、我们可以写这样一个用于依赖管理的子模块POM:

<project>
  <modelVersion>4.0.0</modelVersion>
  <groupId>wang.conge.demo</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>

 

 

2、然后我们的父模块只需要通过非继承的方式来引入这段依赖管理配置:

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

 

3、最后我们的子模块需要哪个jar包就引入哪个jar包

<dependency>
    <groupId>junit</groupId>
    <artifactid>junit</artifactId>
  </dependency>
  <dependency>
    <groupId>log4j</groupId>
    <artifactid>log4j</artifactId>
  </dependency>

 

完美,有没有?

这样,父模块的POM就会非常简洁,由专门的子模块为pom的POM来管理依赖,也契合的面向对象设计中的单一职责原则。

此外,我们还能够创建多个这样的依赖管理POM,以更细化的方式管理依赖。这种做法与面向对象设计中使用组合而非继承也有点相似的味道。

事实上spring-boot非常的简洁已用,也是使用import的方式来管理那么多的jar包依赖的。

haoran_10
粉丝 27
博文 89
码字总数 82446
作品 0
杭州
程序员
私信 提问
加载中
请先登录后再评论。
什么是Maven?

什么是Maven? 介绍 Maven原是一个意第绪语单词,意思是知识的累加器,最初是为了简化Jakarta Turbine项目中的构建过程而开始的。这个工程有几个项目组成,并且每个项目都有自己的Ant构建文件...

osc_6h5gkdny
2018/09/06
2
0
Maven 依赖管理

管理包依赖是 Maven 核心功能之一,下面通过如何引入 jar 包;如何解析 jar 包依赖;包冲突是如何产生;如何解决包冲突;依赖管理解决什么问题;什么是依赖范围;使用包依赖的最佳实践等 6 ...

osc_ik0wlz7f
2019/03/15
2
0
Maven的特点、优点-功能摘要

Maven功能摘要 以下是Maven的主要特点: 遵循最佳实践的简单项目设置 - 在几秒钟内启动新项目或模块 所有项目的一致使用 - 意味着新开发人员进入项目的时间不会增加 卓越的依赖管理,包括自动...

osc_n7y93s8v
2018/09/06
3
0
maven深入最佳实践

"If I have seen further it is by standing on the shoulders of Giants" —— Isaac Newton (1642-1727) 有人认为Maven是一个依赖管理工具,当然这种想法是错误的(确切的说Maven是一个项目......

随便点吧
2014/12/10
2
0
Maven重要概念及最佳实践

Maven是什么 Maven是跨平台的项目管理工具,主要服务于基于Java平台的项目构建、依赖管理和项目信息管理。 什么是构建 除了编写源代码,我们每天有相当一部分时间花在了编译、运行单元测试、...

半糖人
2014/08/22
20
0

没有更多内容

加载失败,请刷新页面

加载更多

漫画 | 韭菜的自我修养!

osc_0vfknl5u
31分钟前
13
0
[Java] 使用ZipInputStream解析zip类文件(jar、docx)的范例

作者: zyl910 一、缘由 现在zip类的文件越来越多了,例如jar、docx。 有时我们需批量处理这些文件中的数据,若都是手工操作的话就太麻烦了。于是考虑编程自动处理。 Java提供了ZipInputStr...

osc_7dn4hojn
32分钟前
11
0
Java常用类-String类

字符串相关的类:String String类:代表字符串,Java 程序中的所有字符串字面值(如 "abc" )都作 为此类的实例实现。 String是一个final类,代表不可变的字符序列 当字符串重新赋值时,需要...

osc_mgvk29y5
33分钟前
5
0
Python处理json模块的详细介绍

前言 本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理。 首先,了解下什么是JSON? JSON:JavaScript Object Notatio...

osc_7bkuddw5
35分钟前
11
0
Go的100天之旅-04基础数据类型

基础数据类型 在变量的定义中,我们讲了每个变量是有类型的,类型在计算机中是用来约束数据的解释。Go语言和其它计算机语言一样,提供丰富了丰富的数据类型,我们就来看看到底有哪些类型,同...

osc_aazzok95
36分钟前
16
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部