专栏首页泛泛聊后端大型项目的依赖包管理

大型项目的依赖包管理

Java的世界里,几乎所有项目的包管理都是使用了Maven,或者在其之上演进的组件。大型项目比如有成百上千个工程,依赖的包比较多,如果没有统一的版本管理,很容易就失控了。

依赖包版本冲突

项目中pom.xml来管理依赖包,会遵循一个最短路径依赖。先看一个Case

<dependencies>
    <dependency>
        <groupId>com.dangdang</groupId>
        <artifactId>elastic-job-lite-spring</artifactId>
        <version>2.1.5</version>
    </dependency>
    <dependency>
        <groupId>com.lihongkun.labs</groupId>
        <artifactId>jmh</artifactId>
        <version>1.0-SNAPSHOT</version>
    </dependency>
</dependencies>

如上代码,项目中依赖了两个jar包,他们各自的依赖如下图

可以看到这两个包的依赖树如图,其中的gson包版本是不一致的。按照最短路径原则的化2.2.2版本的包它的路径是比较短的。所以选择了2.2.2版本。我们可以使用 mvn dependency:tree命令来看最后选择的依赖。

这种情况下,会导致应用无法启动。因为elasticjob的使用强依赖于2.6.1,而其中使用的功能在2.2.2不存在。解决这种版本冲突比较简单,直接使用更短的路径依赖去覆盖,即在本项目中显式指定依赖和版本。但是当项目比较多的时候,坏处就显而易见了。

依赖包版本管理

BOM(Bill of Materials)是由Maven提供的功能,它通过定义一整套相互兼容的jar包版本集合,使用时只需要依赖该BOM文件,即可放心的使用需要的依赖jar包,且无需再指定版本号。BOM的维护方负责版本升级,并保证BOM中定义的jar包版本之间的兼容性。

如何使用

典型的应用如 使用Spring框架时,直接引入其bom进行包依赖管理。在使用具体的包时则不需要再进行包版本的声明。

<dependencyManagement>
   <dependencies>
     <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-framework-bom</artifactId>
        <version>4.3.1.RELEASE</version>
        <type>pom</type>
        <scope>import</scope>
     </dependency>
   </dependencies>
</dependencyManagement>

<dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-web</artifactId>
    </dependency>
<dependencies>

如何自定义

既然有这样好处,那么我们在平时项目的管理中如何编写BOM。建议是整个部门或者大的项目由一个统一的BOM进行管理。

<groupId>com.lihongkun.labs</groupId>
<artifactId>bom</artifactId>
<version>1.0</version>
<packaging>pom</packaging>

<dependencyManagement>
    <!--声明依赖和版本-->
    <dependencies>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.12</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.29</version>
        </dependency>
    <dependencies>
</dependencyManagement>

编写方式同平时进行包依赖引入的时候没什么差别。只是所有的依赖都是使用dependencyManagement这个标签包含起来。

<!--引入bom进行依赖管理-->
<dependencyManagement>
   <dependencies>
     <dependency>
        <groupId>com.lihongkun.labs</groupId>
        <artifactId>bom</artifactId>
        <version>1.0</version>
        <type>pom</type>
        <scope>import</scope>
     </dependency>
   </dependencies>
</dependencyManagement>

<!--声明本项目所需要的依赖-->
<dependencies>
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>druid</artifactId>
    </dependency>
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>fastjson</artifactId>
        <!--指定版本号进行覆盖-->
        <version>1.2.66</version>
    </dependency>
<dependencies>

使用了上述方式即可直接对其中声明的包进行统一的版本管理。如上述代码,fastjson在本项目中需要进行一个单独升级,那么可以直接指定版本号进行覆盖。框架虽然留下了这种灵活性,但是实际使用中最好是进行统一管理。

如果团队中经常出现包管理的问题,不妨使用以下BOM,会有意想不到的效果。

本文分享自微信公众号 - 泛泛聊后端(HelloBackend),作者:李鸿坤

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-04-26

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 手把手教你自定义Spring Boot Starter

    官方提供的Spring Boot Starter涵盖面非常广,几乎所有流行的组件和方案都可以找到对应的封装。不过每个系统总会有自己的公共代码,可以自己进行St...

    李鸿坤
  • Log4j2日志框架

    log4j2是一个比较新的日志框架,作为log4j的升级版本,修复了它的锁竞争问题提升了性能,提供了丰富的组件支持以及良好的语义配置。

    李鸿坤
  • 面向切面编程

    面向切面编程(Aspect Oriented Programming),简称AOP。作为面向对象编程的一个强力补充,在业务系统中很少被关注,却随着Spring的...

    李鸿坤
  • Spring boot集成MybatisPlus

    Mybatis-Plus(简称MP)是一个 Mybatis 的增强工具,在 Mybatis 的基础上只做增强不做改变,为简化开发、提高效率而生。(摘自myba...

    二十三年蝉
  • 解决:springcloud 启动 config-client 报错:... .integration.config.HandlerMethodArgumentResolversHolder

    2. 原因:使用的 pom 版本要为 2.0.3 。我原本是使用的 2.1.6 。

    微风-- 轻许--
  • 震惊!我三步就搞定了 Tomcat 源码环境搭建!

    随着微服务的流行,轻量级的服务应用器也是跟着大火了。毕竟那些企业级的服务应用器部署搭建成本太高。并且springboot 自带的就是 tomcat 服务。

    程序员爱酸奶
  • MyBatis-plus入门Demo详解

    这里我们使用SpringBoot引入依赖,当然非SpringBoot项目的引入也是一样的,为了统一,这里不做过多累述.正如官方所说,mybatis-plus在m...

    Dream城堡
  • 使用Maven创建工程 原

    Maven可以创建Java工程,也可以创建Java Web工程,下面详细介绍一下。

    云飞扬
  • Maven快速入门

    Maven是Java中最为普及的包管理工具,在实际项目中由于依赖的各类jar包非常多,因此概念清晰的处理好各类Jar依赖显得非常重要,接下来通过基础知识,Jar...

    用户1216676
  • Flyway数据迁移工具使用和安装

    以前生产环境数据库增加字段是写一个sql放入本地,到时候部署生产环境的时候先手动执行sql,在部署项目。Flyway数据迁移工具主要是用来控制数据库增删改的版本...

    编程软文

扫码关注云+社区

领取腾讯云代金券