maven多模塊項目依賴管理與依賴?yán)^承詳解
maven多模塊項目依賴管理與依賴?yán)^承
1、指定父模塊與默認(rèn)繼承
dependencies即使在子項目中不寫該依賴項,那么子項目仍然會從父項目中繼承該依賴項(全部繼承)
父模塊的pom
<?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.zhangguo.maven03</groupId> <artifactId>Maven03</artifactId> <packaging>pom</packaging> <version>1.0-SNAPSHOT</version> <modules> <module>Maven03-Dao</module> <module>Maven03-Service</module> </modules> <properties> <junit.version>4.12</junit.version> <spring.version>RELEASE</spring.version> </properties> <dependencies> <!-- junit --> <!-- https://mvnrepository.com/artifact/junit/junit --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>${junit.version}</version> <scope>test</scope> </dependency> </dependencies> </project>
子模塊的pom
<?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"> <!--聲明自己的父模塊,將繼承父模塊的所有依賴--> <parent> <artifactId>Maven03</artifactId> <groupId>com.zhangguo.maven03</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>Maven03-Dao</artifactId> <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aspects</artifactId> <version>${spring.version}</version> <!--版本是從父模塊依賴過來的properties--> </dependency> </dependencies> </project>
RELEASE表示最新的發(fā)布版本,結(jié)果如下:
2、依賴管理
dependencyManagement里只是聲明依賴,并不實現(xiàn)引入,因此子項目需要顯式的聲明需要用的依賴。如果不在子項目中聲明依賴,是不會從父項目中繼承下來的;只有在子項目中寫了該依賴項,并且沒有指定具體版本,才會從父項目中繼承該項,并且version和scope都讀取自父pom;另外如果子項目中指定了版本號,那么會使用子項目中指定的jar版本。
當(dāng)我把父項目中的依賴放到依賴管理中的效果如下所示:
<?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.zhangguo.maven03</groupId> <artifactId>Maven03</artifactId> <packaging>pom</packaging> <version>1.0-SNAPSHOT</version> <modules> <module>Maven03-Dao</module> <module>Maven03-Service</module> </modules> <properties> <junit.version>4.12</junit.version> <spring.version>RELEASE</spring.version> </properties> <!--dependencyManagement里只是聲明依賴,并不實現(xiàn)引入, 因此子項目需要顯式的聲明需要用的依賴。 如果不在子項目中聲明依賴,是不會從父項目中繼承來的; 只有在子項目中寫了該依賴項,并且沒有指定具體版本,才會從父項目中繼承該項, 并且version和scope都讀取自父pom; 另外如果子項目中指定了版本號,那么會使用子項目中指定的jar版本。--> <dependencyManagement> <dependencies> <!-- junit --> <!-- https://mvnrepository.com/artifact/junit/junit --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>${junit.version}</version> <scope>test</scope> </dependency> </dependencies> </dependencyManagement> </project>
結(jié)果
這里的父模塊與子模塊都并沒有依賴junit了,這時的依賴只是用于管理,并沒有真正依賴。
<dependencyManagement>元素既能讓子模塊繼承到父模塊的依賴配置,又能保證子模塊依賴使用的靈活性。
使用<dependencyManagement>聲明的依賴即不會引入依賴,也不會給他的子模塊引入依賴。但這段配置是可以繼承的。
在子類中,依賴配置較原來就簡單了。可以在子類中只配置groupId和artifactId ,省去了version。因為完整的依賴聲明已經(jīng)包含在父POM中。 這樣可以統(tǒng)一項目范圍中依賴的版本,幫助降低依賴沖突的幾率。如果子模塊不聲明依賴的使用,即使該依賴已經(jīng)在父POM的dependencyManangement中聲明了,也不會產(chǎn)生任何實際的效果。
如果想要在某個模塊中使用和另一個模塊中完全一樣的dependencyManagement配置,除了賦值和繼承外,還可以使用import范圍依賴將這一配置導(dǎo)入。
我們要達(dá)到的目的是:父模塊作版本管理不實際依賴,子模塊按需依賴。
父模塊pom
<?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.zhangguo.maven03</groupId> <artifactId>Maven03</artifactId> <packaging>pom</packaging> <version>1.0-SNAPSHOT</version> <modules> <module>Maven03-Dao</module> <module>Maven03-Service</module> </modules> <!--版本管理--> <properties> <junit.version>4.12</junit.version> <spring.version>RELEASE</spring.version> </properties> <!--依賴聲明--> <dependencyManagement> <dependencies> <!-- junit --> <!-- https://mvnrepository.com/artifact/junit/junit --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>${junit.version}</version> <scope>test</scope> </dependency> </dependencies> </dependencyManagement> </project>
子模塊pom:
<?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"> <parent> <artifactId>Maven03</artifactId> <groupId>com.zhangguo.maven03</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>Maven03-Service</artifactId> <dependencies> <!--按需依賴,版本被父模塊控制,可以自行聲明,優(yōu)先級更高--> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> </dependency> </dependencies> </project>
結(jié)果:
這樣做的好處:統(tǒng)一管理項目的版本號,確保應(yīng)用的各個項目的依賴和版本一致,才能保證測試的和發(fā)布的是相同的成果,因此,在頂層pom中定義共同的依賴關(guān)系。
同時可以避免在每個使用的子項目中都聲明一個版本號,這樣想升級或者切換到另一個版本時,只需要在父類容器里更新,不需要任何一個子項目的修改;如果某個子項目需要另外一個版本號時,只需要在dependencies中聲明一個版本號即可。子類就會使用子類聲明的版本號,不繼承于父類版本號。
關(guān)于maven項目依賴?yán)^承問題
在Maven中,子項目是可以繼承父項目的依賴的。
需要在父項目中加入
<modules> <module>childA</module> <module>childB</module> </modules>
把父項目已POM的形式
打包到maven庫中 (*部分必須要有)
<modelVersion>4.0.0</modelVersion> <groupId>com.sang.main</groupId> * <artifactId>Parent-Moduel</artifactId> * <version>1.0.2</version> * <packaging>pom</packaging> <name>Simple-main</name>
在子項目中以<parent>標(biāo)簽
繼承父項目即可。
<parent> <groupId>com.sang.main</groupId> <artifactId>Parent-Moduel</artifactId> <version>1.0.2</version> </parent>
如果是父項目中的直接依賴,在子項目中什么都不用寫,就會自動繼承;
如果是父項目中<dependencyManagement>標(biāo)簽下的依賴,可以有選擇性的繼承,這個時候要自己在子項目添加依賴,需要有<groupId>和<artifactId>,但是版本就可以省略,直接繼承父項目。 這樣一來,我們就可以只繼承父項目中我們需要的,而不是一股腦全部繼承。
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
IntelliJ IDEA配置Tomcat(完整版圖文教程)
這篇文章主要介紹了IntelliJ IDEA配置Tomcat(完整版圖文教程),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-05-05JSON字符串轉(zhuǎn)成java的Map對象詳細(xì)步驟
這篇文章主要介紹了如何將JSON字符串轉(zhuǎn)換為Java對象的步驟,包括定義Element類、使用Jackson庫解析JSON和添加依賴,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2025-01-01