maven父工程relativepath標簽使用解讀
1、概述
我們在使用maven構建父子工程時,通常會在父工程中將pom的打包方式設置為pom,然后在pom文件中使用modules標簽來聲明子工程,我們在子工程的pom文件中使用parent標簽來聲明自己屬于哪個父工程。
這樣的好處是可以方便打包和管理依賴。
2、問題
如果我們的子工程是一個springBoot項目,那么我們可以在pom文件中使用parent標簽去繼承spring-boot的praent工程,這樣的好處是我們項目中使用有關spring-boot的依賴可以全由父工程來管理,方便版本統(tǒng)一。
但現在我們的praent標簽已經指向了我們自己創(chuàng)建的父工程。
在pom中只允許使用一個praent標簽,那還有什么辦法呢?
3、答案(方式一)
這是一個父工程的pom文件,該工程下管理了一個model1子工程
<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>org.example</groupId>
<artifactId>mavenParent</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging>
<modules>
<module>model1</module>
</modules>
</project>子工程pom文件:我們可以看到我們的父工程是聲明的spring-boot-starter-parent,而不是我們自己的父工程,其實這樣也可以被我們自己的父工程所管理,因為我們在父工程中使用了modules標簽。
這里有一個關鍵點:我將relativePath標簽關閉了,也就是置空.(該標簽必須置空,不寫會使用默認值也會報錯)。
如果你是使用idea創(chuàng)建的maven工程,手動勾選了springboot,那么在relativePath標簽旁邊會注釋一段話:在本地倉庫查找依賴
<?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>
<artifactId>model1</artifactId>
<packaging>jar</packaging>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.2</version>
<relativePath /><!-- lookup parent from repository -->
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<!-- 這里不需要指定版本號,版本由上面的父工程管理了 -->
</dependency>
</dependencies>
</project>4、詳解
relativePath標簽含義:指定父工程的pom文件路徑
如果你不使用這個標簽,那他的默認值是<relativePath>../pom<relativePath>。也就是指向當前模塊的上一級目錄中的pom文件,也就是我們自己聲明的父工程。
他的查找順序為:relativePath元素中的地址–本地倉庫–遠程倉庫。如果標簽指定的地址找不到他就會去本地的maven倉庫中找,如果本地倉庫沒有那就去遠程倉庫找。
使用<relativePath/>指定一個空地址,他就會去本地倉庫中找。
5、番外:方式二
還有一種方式那就是不使用繼承spring-boot-starter-parent的方式來管理springboot的依賴,我們可以點進這個spring-boot-starter-parent的pom文件中查看,我們發(fā)現它也有一個父工程
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.7.2</version>
</parent>
<artifactId>spring-boot-starter-parent</artifactId>
<packaging>pom</packaging>
<name>spring-boot-starter-parent</name>
<description>Parent pom providing dependency and plugin management for applications built with Maven</description>
我們再點進這個父工程spring-boot-dependencies看,(這是一部分),我們可以看到其實幫我們管理版本的是這個父工程,它的打包方式也是pom,在properties標簽中管理了很多依賴的版本。
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.7.2</version>
<packaging>pom</packaging>
<name>spring-boot-dependencies</name>
<description>Spring Boot Dependencies</description>
<url>https://spring.io/projects/spring-boot</url>
<properties>
<activemq.version>5.16.5</activemq.version>
<antlr2.version>2.7.7</antlr2.version>
<appengine-sdk.version>1.9.98</appengine-sdk.version>
<artemis.version>2.19.1</artemis.version>
<aspectj.version>1.9.7</aspectj.version>
<assertj.version>3.22.0</assertj.version>
<atomikos.version>4.0.6</atomikos.version>
</properties>
</project>既然是這樣,還記得dependencyManagement標簽嗎,這個標簽可不是只能在父工程中才可以使用,我們在這里使用該標簽來導入spring-boot-dependencies為我們整理的依賴,這樣項目中國使用到的有關springboot的依賴就又可以不寫版本號了。
<?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>
<artifactId>model1</artifactId>
<packaging>jar</packaging>
<!--自己的父工程-->
<parent>
<groupId>org.example</groupId>
<artifactId>mavenParent</artifactId>
<version>1.0-SNAPSHOT</version>
<relativePath/>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<!-- 這里不需要指定版本號,版本由下面的dependencyManagement管理了 -->
</dependency>
</dependencies>
<!-- 這里dependencyManagement管理版本,只是管理版本,不導入依賴哦! -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.7.2</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
</project>總結
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
解決springboot項目上傳文件出現臨時文件目錄為空的問題
這篇文章主要介紹了解決springboot項目上傳文件出現臨時文件目錄為空的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-09-09
springboot2.0使用Hikari連接池的方法(替換druid)
這篇文章主要介紹了springboot 2.0使用Hikari連接池的方法(替換druid),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-12-12
Spring?BeanFactory?與?FactoryBean?的區(qū)別詳情
這篇文章主要介紹了Spring?BeanFactory?與?FactoryBean?的區(qū)別詳情,BeanFactory?和?FactoryBean?的區(qū)別卻是一個很重要的知識點,在本文中將結合源碼進行分析講解,需要的小伙伴可以參考一下2022-05-05
java多線程開發(fā)之通過對戰(zhàn)游戲學習CyclicBarrier
這篇文章給大家分享了關于java多線程開發(fā)中通過對戰(zhàn)游戲學習CyclicBarrier的相關知識點內容,有興趣的朋友們學習參考下。2018-08-08

