`
haoran_10
  • 浏览: 436374 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

maven-依赖管理最佳实践

阅读更多

一般一个父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包依赖的。

0
0
分享到:
评论

相关推荐

    Maven 依赖之最佳实践.pdf

    附件为在阅读Maven实战时为依赖的最佳实践进行总结而输出的博客。一面加深理解,也希望能帮助需要的人

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

    dependencyManagement 是表⽰依赖 jar 包的声明,即你在项⽬中的 dependencyManagement 下声明了依赖,maven 不会加 载该依赖,dependencyManagement 声明可以被继承。 dependencyManagement 的⼀个使⽤案例是当有⽗...

    Maven原理和实践-培训课件.ppt

    何为Maven 构建,依赖管理,项目信息聚合 Maven核心概念 坐标,依赖,仓库,生命周期,插件 Maven最佳实践 创建、打包、发布、版本管理 项目实战 Nexus(Todo…) M2eclipse(Todo…)

    Maven基础 - 更简单的构建过程 - 统一构建系统 - 优质工程咨询 - 透明地迁移到新功能 - 最佳实践开发指南

    Apache Maven 是一个软件项目管理和依赖管理工具。基于项目对象模型(POM:Project Object Model)的概念,Maven 可以从一个中心信息块管理项目的构建、报告和文档。 无论是小型的开源类库项目,还是大型的企业级...

    Maven最佳实践之一个好的parent依赖基础

    今天小编就为大家分享一篇关于Maven最佳实践之一个好的parent依赖基础,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧

    maven window下安装包

    第5章:坐标和依赖/5.9 最佳实践/5.9.2 依赖属性使用变量 第5章:坐标和依赖/5.9 最佳实践/5.9.3 依赖关系查看 第6章:仓库/6.1 何为Maven仓库 第6章:仓库/6.2 仓库的布局 第6章:仓库/6.3 仓库的分类 第6章:仓库/...

    深入浅出maven3

    作为apache组织中的一个颇为成功的开源项目,maven主要服务于基于 java平台的项目构建、依赖管理和项目信息管理。 maven能干什么 使项目构建构成更容易; 提供统一构建系统(编译、测试、持续整合...); 提供高质量...

    Maven2 的新特性.7z

    除此之外,"简化工作,使用业界公认的最佳实践"也是是 Maven2 的另一大主题,其他的新特性无处不在体现 Maven2 为简化工作而做出的努力。 2. 更少的配置文件 Maven1 和 Maven2 主要配置文件的对比: • Maven1:...

    软件开发+Maven技术+Maven安装与配置+基础课程

    此外,课程还将介绍Maven的高级主题,包括多模块项目的构建、构建配置的定制化、以及集成到持续集成/持续部署(CI/CD)流程中的最佳实践。通过本课程的学习,学员将能够熟练运用Maven进行项目开发,掌握Maven在不同...

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

    Maven实战(高清版)

    HOME2.3.2 ~/.m22.4 设置http代理2.5 安装m2eclipse2.6 安装netbeans maven插件2.7 maven安装最佳实践2.7.1 设置maven_opts环境变量2.7.2 配置用户范围settings?xml2.7.3 不要使用ide内嵌的maven2.8 小结第...

    jaxrs-sample:用于最佳 REST 实践的基于 REST JAX-RS CXF 的示例脚手架

    REST JAX-RS CXF Spring 最佳实践模板。 描述 从非持久内存数据存储中添加、检索和删除存储的示例应用程序。 PUT - 使用客户端提供的 ID 添加或更新存储 GET - 获取商店 DELETE - 删除存储 特征 多模块maven项目 ...

    Apache Maven项目构建工具-其他

    Maven的主要功能:1、遵循最佳实践的简单项目设置-数秒内即可启动新项目或模块。2、所有项目的用法一致-意味着新开发人员无需花更多时间来参与项目。3、高级依赖性管理,包括自动更新,依赖性关闭(也称为传递依赖性...

    毕业设计-基于Spring Boot、Layui和Mybatis-plus的后台管理系统脚手架项目源码.zip

    掌握快速开发、前端界面设计和数据库操作,学习最佳实践和定制扩展。提供实用项目基础,培养综合能力。适合学习和实践,助力我们快速构建高效后台管理系统。 运行环境 Jdk8+IntelliJ IDEA+Maven 项目技术(必填) ...

    商店:spring cloud最佳实践项目实例,使用了spring cloud全家桶,TCC事务管理,EDA事务最终一致性等技术的下单示例

    docker-maven-plugin:直接生成Dockerfile(本地需更换成阿里云层叠,速度和成功率会提升很多) H2:内存式数据库,减少数据库依赖(正式环境时,可以直接切换至MYSQL) spring cloud eureka:用于服务注册发现 ...

    Spring-Boot-Reference.pdf

    •最佳实践:代码结构| @Configuration | @EnableAutoConfiguration | Beans和依赖注入 •运行代码: IDE |打包| Maven | Gradle •包装应用程序: 生产jar •Spring Boot CLI: 使用CLI •核心特性: SpringApplication ...

    xmljava系统源码-baymax:基于springboot的web项目最佳实践

    基于springboot的web项目最佳实践 springboot 可以说是现在做javaweb开发最火的技术,我在基于springboot搭建项目的过程中,踩过不少坑,发现整合框架时并非仅仅引入starter 那么简单。 要做到简单,易用,扩展性更...

    Spring Boot中配置Redis的讲义最全讲义

    2.1 添加Maven依赖 2.2 配置application.properties 编写Redis配置类 3.1 使用@Configuration注解 3.2 使用@EnableCaching注解 3.3 配置Redis连接工厂 3.4 配置RedisTemplate 编写Redis缓存操作示例 4.1 添加缓存...

    JAVA毕业设计之基于springboot的医药管理系统(springboot+mysql)完整源码.zip

    基于Spring Boot的医药管理系统是一个针对药店或...总之,该医药管理系统通过整合现代Java开发的最佳实践,提供了一个健壮、可扩展且易于维护的解决方案,适用于毕业设计项目,能够展示学生在软件开发方面的综合能力。

Global site tag (gtag.js) - Google Analytics