目錄
背景
博主工作負責的微服務已經達到了十幾個,每個微服務相互直接都是獨立的,有獨立的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,關於二者的區別請讀者自己搜索。
參考鏈接
- 我的GitHub:pom-starters(我實際項目中使用的,可以直接mvn install,作爲參考)
- Maven 官方文檔,本文代碼出自官方文檔(查詢很久沒有我想要的內容,結果偶然在官方文檔找到了
- Spring-Boot-Parent 項目地址,可以對比研究
- Maven實戰(三)——多模塊項目的POM重構(這篇文章給了我啓發,但是他的講解還是不夠詳細,不能完全匹配我的問題
————————————————
版權聲明:本文爲CSDN博主「pinebud55」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/pinebud55/article/details/78667299