Maven 多項目依賴版本管理(Maven Multi Project version management)

博主工作負責的微服務已經達到了十幾個,每個微服務相互直接都是獨立的,有獨立的project,於是maven的依賴管理就很頭疼了。每一個項目都需要添加自己的版本,還要互相比對,每次升級一些第三方依賴需要修改所有文件,於是產生了自己寫parent的想法。

訪問我的個人網站獲取更多文章

問題

第一種思路是:自己寫一個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包含了所有的子依賴集合項目。

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

創建pom 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>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,關於二者的區別請讀者自己搜索。

參考鏈接

我的GitHub:pom-starters(我實際項目中使用的,可以直接mvn install,作爲參考)
Maven 官方文檔,本文代碼出自官方文檔(查詢很久沒有我想要的內容,結果偶然在官方文檔找到了
Spring-Boot-Parent 項目地址,可以對比研究
Maven實戰(三)——多模塊項目的POM重構(這篇文章給了我啓發,但是他的講解還是不夠詳細,不能完全匹配我的問題

這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章