微服务中使用Maven BOM来管理你的版本依赖详解

BOM简介

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

为什么要使用BOM

使用BOM除了可以方便使用者在声明依赖的客户端时不需要指定版本号外,最主要的原因是可以解决依赖冲突,如考虑以下的依赖场景:

项目A依赖项目B 2.1和项目C 1.2版本:
项目B 2.1依赖项目D 1.1版本;
项目C 1.2依赖项目D 1.3版本;

在该例中,项目A对于项目D的依赖就会出现冲突,按照maven dependency mediation的规则,最后生效的可能是:项目A中会依赖到项目D1.1版本(就近原则,取决于路径和依赖的先后,和Maven版本有关系)。

在这种情况下,由于项目C依赖1.3版本的项目D,但是在运行时生效的确是1.1版本,所以在运行时很容易产生问题,如 NoSuchMethodError, ClassNotFoundException等。

如何定义BOM

BOM本质上是一个普通的POM文件,区别是对于使用方而言,生效的只有<dependencyManagement>这一个部分。只需要在<dependencyManagement>定义对外发布的客户端版本即可:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.ydj.qd</groupId>
  <artifactId>inf-bom</artifactId>
  <version>1.0</version>
  <packaging>pom</packaging>

  <name>inf-bom</name>
  <description>第三方jar包统一管理</description>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <java.version>1.8</java.version>
    <spring.version>4.3.15.RELEASE</spring.version>
  </properties>

  <dependencyManagement>
    <dependencies>

      <!-- 阿里 -->
      <!-- https://mvnrepository.com/artifact/com.alibaba/druid -->
      <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>druid</artifactId>
        <version>1.1.12</version>
      </dependency>
      <!-- https://mvnrepository.com/artifact/com.aliyun.mns/aliyun-sdk-mns -->
      <dependency>
        <groupId>com.aliyun.mns</groupId>
        <artifactId>aliyun-sdk-mns</artifactId>
        <version>1.1.8</version>
        <classifier>jar-with-dependencies</classifier>
      </dependency>
      <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>fastjson</artifactId>
        <version>1.2.29</version>
      </dependency>

      <!-- Apache -->
      <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-lang3</artifactId>
        <version>3.3.2</version>
      </dependency>
      <dependency>
        <groupId>commons-collections</groupId>
        <artifactId>commons-collections</artifactId>
        <version>3.2.2</version>
      </dependency>
      <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-collections4</artifactId>
        <version>4.1</version>
      </dependency>
      <dependency>
        <groupId>commons-beanutils</groupId>
        <artifactId>commons-beanutils</artifactId>
        <version>1.9.1</version>
      </dependency>

      <!-- 谷歌 -->
      <!-- https://mvnrepository.com/artifact/com.google.guava/guava -->
      <dependency>
        <groupId>com.google.guava</groupId>
        <artifactId>guava</artifactId>
        <version>27.0.1-jre</version>
      </dependency>
      <dependency>
        <groupId>com.google.code.gson</groupId>
        <artifactId>gson</artifactId>
        <version>2.8.5</version>
      </dependency>

      <!-- 常用工具 -->
      <dependency>
        <groupId>joda-time</groupId>
        <artifactId>joda-time</artifactId>
        <version>2.7</version>
      </dependency>
      <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.14.4</version>
      </dependency>

    </dependencies>
  </dependencyManagement>

  <build>
  </build>

  <distributionManagement>
    <repository>
      <id>maven-releases</id>
      <name>maven-releases</name>
      <url>http://mvn.ydj.com/repository/maven-releases/</url>
    </repository>
    <snapshotRepository>
      <id>maven-snapshots</id>
      <name>maven-snapshots</name>
      <url>http://mvn.ydj.com/repository/maven-snapshots/</url>
    </snapshotRepository>
  </distributionManagement>

</project>

项目使用方法

在你的项目主pom.xml文件中<dependencyManagement></dependencyManagement>节点下首位处加入如下:

<dependencyManagement>
  <dependencies>
     <dependency>
      <groupId>com.jlcx.qd</groupId>
      <artifactId>inf-bom</artifactId>
      <version>${version}</version>
      <type>pom</type>
      <scope>import</scope>
     </dependency>

     <dependency>
      ...
     </dependency>
  </dependencies>
</dependencyManagement>

在需要使用相关JAR包的pom.xml文件中<dependencies></dependencies>节点下引入如下:

<dependencies>
  ...
  <dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
  </dependency>

  <dependency>
    <groupId>commons-collections</groupId>
    <artifactId>commons-collections</artifactId>
  </dependency>
  ....
</dependencies>

如果需要使用不同于当前bom中所维护的jar包版本,则加上<version>覆盖即可,如:

<dependencies>
  ...
  <dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
  </dependency>

  <dependency>
    <groupId>commons-collections</groupId>
    <artifactId>commons-collections</artifactId>
    <version>3.2.1</version>
  </dependency>
  ....
</dependencies>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • 详解IDEA多module项目maven依赖的一些说明

    不管eclipse有没有被被时代抛弃,反正是被我抛弃了,因为IDEA是真的好用 现在公司的项目基本都是基于maven的多module项目,controller,service,model,dao等都被分成了不同的module,这样做当然也是为了解耦. 这些module可根据需要在pom.xml配置来打成war包或者jar包 <packaging>jar</packaging> web主项目设置packaging级别为war,dao.model这些module设置packaging级

  • 导出maven项目依赖的jar包(图文教程)

    注意使用mvn命令是需要配置好maven的环境变量 一.导出到自定义目录中 在maven项目下创建lib文件夹,输入以下命令: mvn dependency:copy-dependencies -DoutputDirectory=lib maven项目所依赖的jar包都会复制到项目目录下的lib目录下 这是我需要导出的jar包: 项目的根目录: 打开cmd,进入项目根目录(pom.xml文件也在这里),并执行目录,lib文件如没有手动创建也会自动创建: 稍等片刻,maven便完成了复制 二.导出

  • Maven如何构建可执行的jar包(包含依赖jar包)

    目标: 将依赖的第三方jar包打进去 方法: maven-assembly-plugin 环境: IDEA 2016.3 JDK 1.8 遇到的问题: 此处耗时2天时间,遇到过的坑: 1.修改完pom.xml后,不生效. --改pom.xml后,代码不生效,是因为对IDEA工具不熟,在修改完xml后,需要点工具右下角的import changes或者直接点auto-import就可以一劳永逸了. 2.生成jar后,idea可以执行,但是java -jar无法执行,报错Exception in t

  • spring boot的maven配置依赖详解

    本文介绍了spring boot的maven配置依赖详解,分享给大家,具体如下: 我们通过引用spring-boot-starter-parent,添加spring-boot-starter-web 可以实现web项目的功能,当然不使用spring-boot-start-web,通过自己添加的依赖包也可以实现,但是需要一个个添加,费时费力,而且可能产生版本依赖冲突.我们来看下springboot的依赖配置: 利用pom的继承,一处声明,处处使用.在最顶级的spring-boot-dependen

  • IDEA引MAVEN项目jar包依赖导入问题解决方法

    IDEA内置了Maven环境,默认采用Maven解决项目依赖问题.在新建项目后,项目的路径中会生成pom.xml文件和项目名.iml文件.新建项目后,IDEA不会自动刷新Maven的依赖.以Spring Application为例,新建项目编译时提示以下错误信息: 刷新Maven配置的方法为: (1)右键单击项目: (2)在弹出菜单中选择Maven|Reimport菜单项. 此时,IDEA将通过网络自动下载相关依赖,并存放在Maven的本地仓库中.另外,可以将Maven的刷新设置为自动,配置方法

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

    使用parent 控制依赖版本是很常见的事. 如果你有过控制依赖版本的这种经历,你可能就会遇到过第三方版本之间的冲突,本文不介绍如何解决冲突,但是会提供给你一个基本不存在冲突的基础依赖. 得益于 Spring ,尤其是 Spring Boot 对第三方集成提供的 starter.Spring Boot 对可能用到的第三方依赖提供了很好的版本控制,我们就依靠 Spring 提供的 bom 和 dependencies 来实现我们自己的基础依赖. 由于 Spring Boot 2.0 正式版还没有发

  • 深入理解Maven的坐标与依赖

    在前边两节中,我们学习了Maven的基本概念以及何为Maven仓库,并且如何配置settings.xml文件等相关知识点.Maven的主要作用是可以帮助我们自动下载在pom.xml中配置添加的依赖.那么在本节中,我们将学习如何引入依赖. 知识点包括: Maven的坐标,Maven的依赖配置,依赖范围,传递性依赖,依赖调解,可选依赖,排除依赖,归类依赖和优化依赖 Maven的坐标 Maven的仓库中拥有着无数的构件,每一个构件都是一个jar或者war等文件,如果没有坐标,那么我们将无法唯一标识该构

  • 浅谈Maven 项目中依赖的搜索顺序

    网上有很多关于maven项目中mirror.profile.repository的搜索顺序的文章,说法不一.官方文档并没有找到相关的说明,鉴于此,我抽时间做了一个验证. 依赖仓库的配置方式 maven项目使用的仓库一共有如下几种方式: 中央仓库,这是默认的仓库 镜像仓库,通过 sttings.xml 中的 settings.mirrors.mirror 配置 全局profile仓库,通过 settings.xml 中的 settings.repositories.repository 配置 项目

  • maven添加oracle依赖失败问题的处理方法

    由于Oracle授权问题,Maven3不提供oracle JDBC driver 可以到maven中央仓库去下载依赖,网址: http://repo.spring.io/plugins-release/com/oracle/ojdbc6/11.2.0.3/     复制到本地仓库对应目录即可 <!-- oracle --> <dependency> <groupId>com.oracle</groupId> <artifactId>ojdbc6&

  • maven打包成第三方jar包且把pom依赖包打入进来的方法

    添加此PLUGIN到项目的POM.XML中 <build> <plugins> <plugin> <artifactId>maven-assembly-plugin</artifactId> <configuration> <archive> <manifest> <mainClass>com.allen.capturewebdata.Main</mainClass> </mani

随机推荐