Maven 多项目依赖版本管理(Maven Multi Project version management) 涉及自己的parent与spring-boot-starter-parent如何兼容

 

目录

背景

问题

我发现了一个概念:bom

第一:创建bom

第二:创建pom parent

第三步:创建依赖集合项目

第四步:使用

参考链接


背景

博主工作负责的微服务已经达到了十几个,每个微服务相互直接都是独立的,有独立的project,于是maven的依赖管理就很头疼了。每一个项目都需要添加自己的版本,还要互相比对,每次升级一些第三方依赖需要修改所有文件,于是产生了自己写parent的想法。

maven多继承和继承链: 【这个文章里的思路和pom不匹配,pom示例都是方案1,只是谁是parent谁放到dependencyManagement里的区别,明白有两个方案即可】

问题


第一种思路是:自己写一个parent pom,使用dependencyManagement管理所有依赖的版本,通过maven install安装到本地仓库。之后在使用的地方设置parent为之前写的即可。

     问题:但是这样做存在一个问题,我使用了spring-boot-starter-parent, maven只允许存在一个parent。当然可以通过在项目中使用dependencyManagement解决,但是我想统一到一起管理。

第二个思路:将自己写的parent pom的parent设置为spring-boot-starter-parent即可解决上一个问题。注意:dependencyManagement中出现的每一个依赖,必须写明版本。当我的项目继承自己的parent的时候,也自动的继承了spring-boot-starter-parent,所以,依赖于spring-boot-starter-parent提供版本的项目,不必再写到dependencyManagement中。

    思路二的问题是:我所有项目没有采用spring-boot-starter-web提供的tomcat容器,而是使用了jetty,包括我很多项目使用了一些相同的依赖,是否可以将这些依赖组合在一起,简化我的配置呢?

简而言之,我想做一个和spring一样的pom version管理。通过搜索和阅读maven的文档,

我发现了一个概念:bom

构建自己的依赖库
bom:bill of materials,直译过来是物料清单,我们通过bom的方式构建自己的依赖管理。

第一:创建bom


新建一个maven项目,pom.xml文件即我们的bom文件。 
我们在bom文件中管理所有的子依赖集合项目【只管理自身子项目的依赖??意义何在。答:独立管理,其本身不负责依赖版本的管理。

bom文件的packaging属性为pom,dependencyManagement:包含了所有的子依赖集合项目。

希望使用该库的其他项目应将此bom-pom导入其pom的dependencyManagement部分,即可使用bom维护的子项目的版本;

 第二也可以把bom作为parent继承

<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.test</groupId>
  <artifactId>bom</artifactId>
  <version>1.0.0</version>
  <packaging>pom</packaging>
  <properties>
    <project1Version>1.0.0</project1Version>
    <project2Version>1.0.0</project2Version>
  </properties>
  <dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>com.test</groupId>
        <artifactId>project1</artifactId>
        <version>${project1Version}</version>
      </dependency>
      <dependency>
        <groupId>com.test</groupId>
        <artifactId>project2</artifactId>
        <version>${project1Version}</version>
      </dependency>
    </dependencies>
  </dependencyManagement>
  <modules>
    <module>parent</module>
  </modules>
</project>

 通过dependencyManagement import引入:

<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.test</groupId>
  <artifactId>use-bom</artifactId>
  <version>1.0.0</version>
  <packaging>jar</packaging>
 
  <dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>com.test</groupId>
        <artifactId>bom</artifactId>
        <version>1.0.0</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>
    </dependencies>
  </dependencyManagement>
  <dependencies>
    <dependency>
      <groupId>com.test</groupId>
      <artifactId>project1</artifactId>
    </dependency>
    <dependency>
      <groupId>com.test</groupId>
      <artifactId>project2</artifactId>
    </dependency>
  </dependencies>
</project>


第二:创建pom parent 把bom作为parent


创建一个子模块,parent为bom,这个模块负责所有的公共依赖的版本管理。在我的实际情况中,由于该文件已经有了parent,所以我把spring的parent也放在了dependencyManagement中。

<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>
  <parent>
    <groupId>com.test</groupId>
    <version>1.0.0</version>
    <artifactId>bom</artifactId>
  </parent>

  <groupId>com.test</groupId>
  <artifactId>parent</artifactId>
  <version>1.0.0</version>
  <packaging>pom</packaging>

  <dependencyManagement>
    <dependencies>
       <dependency>
           <groupId>org.springframework.boot</groupId>
           <artifactId>spring-boot-dependencies</artifactId>
           <version>1.5.9.RELEASE</version>
           <type>pom</type>
           <scope>import</scope>
      </dependency>
      <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>1.2.12</version>
      </dependency>
      <dependency>
        <groupId>commons-logging</groupId>
        <artifactId>commons-logging</artifactId>
        <version>1.1.1</version>
      </dependency>
    </dependencies>
  </dependencyManagement>
  <modules>
    <module>project1</module>
    <module>project2</module>
  </modules>
</project>


第三步:创建依赖集合项目


这是具体的依赖集合,我们可以将几乎每个项目都有的依赖放在一起

<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>
  <parent>
    <groupId>com.test</groupId>
    <version>1.0.0</version>
    <artifactId>parent</artifactId>
  </parent>
  <groupId>com.test</groupId>
  <artifactId>project1</artifactId>
  <version>${project1Version}</version>
  <packaging>jar</packaging>

  <dependencies>
    <dependency>
      <groupId>log4j</groupId>
      <artifactId>log4j</artifactId>
    </dependency>
  </dependencies>
</project>

 

<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>
  <parent>
    <groupId>com.test</groupId>
    <version>1.0.0</version>
    <artifactId>parent</artifactId>
  </parent>
  <groupId>com.test</groupId>
  <artifactId>project2</artifactId>
  <version>${project2Version}</version>
  <packaging>jar</packaging>

  <dependencies>
    <dependency>
      <groupId>commons-logging</groupId>
      <artifactId>commons-logging</artifactId>
    </dependency>
  </dependencies>
</project>


第四步:使用


在上述项目的根目录运行:mvn install 安装到自己的本地仓库。 
在你的其它的独立项目中,将上述的parent作为项目的parent,被parent中管理的依赖便不需要写版本了。也可以在dependencies中添加第三步的依赖集合,简化你项目的pom文件。

<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.test</groupId>
  <artifactId>use</artifactId>
  <version>1.0.0</version>
  <packaging>jar</packaging>

  <parent>
    <groupId>com.test</groupId>
    <artifactId>parent</artifactId>
    <version>1.0.0</version>
  </parent>
  <dependencies>
    <dependency>
      <groupId>com.test</groupId>
      <artifactId>project1</artifactId>
    </dependency>
    <dependency>
      <groupId>com.test</groupId>
      <artifactId>project2</artifactId>
    </dependency>
  </dependencies>
</project>


记住:在任何情况下,都可以使用dependencyManagement替代parent,关于二者的区别请读者自己搜索。

 

参考链接

 

————————————————
版权声明:本文为CSDN博主「pinebud55」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/pinebud55/article/details/78667299

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
回答: spring-boot-starter-parentmaven对应版本的关系是,当我们的项目指定了parentspring-boot-starter-parent后,就可以省略插件目标配置了。具体来说,spring-boot-starter-parent中的pluginManagement对spring-boot-maven-plugin版本进行了管理。\[1\]这意味着,当我们使用spring-boot-starter-parent作为项目parent时,不需要再显式地指定spring-boot-maven-plugin的版本,因为它已经在spring-boot-starter-parent中进行了配置。\[2\]另外,还有一个替代spring-boot-starter-parent的选项是spring-boot-dependencies,它也可以用来管理Spring Boot项目依赖版本。\[3\] #### 引用[.reference_title] - *1* *3* [Spring Boot 第三篇:理解 spring-boot-starter-parent](https://blog.csdn.net/zzuhkp/article/details/123518287)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [深入理解 spring-boot-starter-parent](https://blog.csdn.net/weixin_43888891/article/details/130520345)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值