您好,登錄后才能下訂單哦!
本篇內(nèi)容介紹了“Maven的基礎(chǔ)知識(shí)整理”的有關(guān)知識(shí),在實(shí)際案例的操作過(guò)程中,不少人都會(huì)遇到這樣的困境,接下來(lái)就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!
Maven工程基礎(chǔ)知識(shí)
Maven倉(cāng)庫(kù)的分類(lèi)
Maven常用命令的含義
一個(gè)項(xiàng)目生命周期
打包類(lèi)型:<packaging >
依賴范圍:<scope>
聚合與繼承的關(guān)系
依賴沖突
依賴調(diào)節(jié)原則
解決依賴沖突-使用MavenHelper
maven 工程中不直接將 jar 包導(dǎo)入到工程中,而是通過(guò)在 pom.xml 文件中添加所需 jar包的坐標(biāo),這樣就很好的避免了 jar 直接引入進(jìn)來(lái),在需要用到 jar 包的時(shí)候,只要查找 pom.xml 文件,再通過(guò) pom.xml 文件中的坐標(biāo),到一個(gè)專(zhuān)門(mén)用于”存放 jar 包的倉(cāng)庫(kù)”(maven 倉(cāng)庫(kù))中根據(jù)坐標(biāo)從而找到這些 jar 包,再把這些 jar 包拿去運(yùn)行。
為了解決這個(gè)過(guò)程中速度慢的問(wèn)題,maven 中也有索引的概念,通過(guò)建立索引,可以大大提高加載 jar 包的速度
本地倉(cāng)庫(kù) :用來(lái)存儲(chǔ)從遠(yuǎn)程倉(cāng)庫(kù)或中央倉(cāng)庫(kù)下載的插件和 jar 包,項(xiàng)目使用一些插件或 jar 包,優(yōu)先從本地倉(cāng)庫(kù)查找
遠(yuǎn)程倉(cāng)庫(kù):如果本地需要插件或者 jar 包,本地倉(cāng)庫(kù)沒(méi)有,默認(rèn)去遠(yuǎn)程倉(cāng)庫(kù)下載(私服)。
中央倉(cāng)庫(kù):在 maven 軟件中內(nèi)置一個(gè)遠(yuǎn)程倉(cāng)庫(kù)地址https://www.mvnrepository.com/ ,它是中央倉(cāng)庫(kù),服務(wù)于整個(gè)互聯(lián)網(wǎng)。
compile:編譯--- compile 是 maven 工程的編譯命令,作用是將 src/main/java 下的文件編譯為 class 文件輸出到 target目錄下。
clean:清理--- clean 是 maven 工程的清理命令,執(zhí)行 clean 會(huì)刪除 target 目錄及內(nèi)容。
test:測(cè)試--- test 是 maven 工程的測(cè)試命令 mvn test,會(huì)執(zhí)行 src/test/java 下的單元測(cè)試類(lèi)。
package:打包---package 是 maven 工程的打包命令,對(duì)于 java 工程執(zhí)行 package 打成 jar 包,對(duì)于 web 工程打成 war包。
install:安裝--- install 是 maven 工程的安裝命令,執(zhí)行 install 將 maven 打成 jar 包或 war 包發(fā)布到本地倉(cāng)庫(kù)
jar:執(zhí)行 package 會(huì)打成 jar 包
war:執(zhí)行 package 會(huì)打成 war 包
pom :用于 maven 工程的繼承,通常父工程設(shè)置為 pom
A 依賴 B,需要在 A 的 pom.xml 文件中添加 B 的坐標(biāo),添加坐標(biāo)時(shí)需要指定依賴范圍,依賴范圍包括:
compile:compile指 A 在編譯時(shí)依賴 B,此范圍為默認(rèn)依賴范圍。編譯范圍的依賴會(huì)用在編譯、測(cè)試、運(yùn)行,由于運(yùn)行時(shí)需要所以編譯范圍的依賴會(huì)被打包。
provided:provided 依賴只有在當(dāng) JDK 或者一個(gè)容器已提供該依賴之后才使用, provided 依賴在編譯和測(cè)試時(shí)需要,在運(yùn)行時(shí)不需要,比如:servlet api 被 tomcat 容器提供。
runtime:runtime 依賴在運(yùn)行和測(cè)試系統(tǒng)的時(shí)候需要,但在編譯的時(shí)候不需要。比如:jdbc的驅(qū)動(dòng)包。由于運(yùn)行時(shí)需要所以 runtime 范圍的依賴會(huì)被打包。
test:test 范圍依賴 在編譯和運(yùn)行時(shí)都不需要,它們只有在測(cè)試編譯和測(cè)試運(yùn)行階段可用,比如:junit。由于運(yùn)行時(shí)不需要所以 test范圍依賴不會(huì)被打包。
system:system 范圍依賴與 provided 類(lèi)似,但是你必須顯式的提供一個(gè)對(duì)于本地系統(tǒng)中 JAR文件的路徑,需要指定 systemPath 磁盤(pán)路徑,system依賴不推薦使用。
依賴范圍由強(qiáng)到弱的順序是:compile>provided>runtime>test
pom文件中常用標(biāo)簽的含義
<?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> <!--聲明項(xiàng)目描述符遵循哪一個(gè)POM模型版本。4.0.0--> <groupId>com.tfjybj</groupId> <artifactId>super</artifactId> <packaging>pom</packaging> <version>1.0.0-SNAPSHOT</version> <!--項(xiàng)目的名稱, Maven產(chǎn)生的文檔用--> <name>super</name> <!-- 項(xiàng)目的詳細(xì)描述, Maven 產(chǎn)生的文檔用。--> <description>super</description> <!--聚合 來(lái)管理同個(gè)項(xiàng)目中的其他模塊--> <modules> <module>super-common</module> <module>super-gateway</module> <module>super-zipkin</module> <module>super-provider</module> <module>super-provider-api</module> </modules> <!--繼承 說(shuō)明這是一個(gè)boot工程--> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.8.RELEASE</version> </parent> <!--統(tǒng)一管理jar包版本--> <properties> <!--項(xiàng)目編碼方式,maven編譯版本--> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>8</maven.compiler.source> <maven.compiler.target>8</maven.compiler.target> <!--統(tǒng)一管理jar包版本--> <spring.cloud.version>2.1.0.RELEASE</spring.cloud.version> <spring.boot.version>2.1.8.RELEASE</spring.boot.version> <mysql.version>6.0.6</mysql.version> </properties> <!--統(tǒng)一管理版本號(hào)--> <!--在父工程pom文件中聲明依賴,但不引入,父項(xiàng)目聲明,供子項(xiàng)目按需引入--> <dependencyManagement> <dependencies> <!-- nacos服務(wù)注冊(cè)/發(fā)現(xiàn)--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> <version>${spring.cloud.version}</version> <!--排除ribbon的依賴--> <exclusions> <exclusion> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-ribbon</artifactId> </exclusion> </exclusions> </dependency> <!--nacos配置中心來(lái)做配置管理--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> <version>${spring.cloud.version}</version> </dependency> <!--mysql--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>${mysql.version}</version> <!-- mysql依賴的作用范圍--> <scope>runtime</scope> </dependency> </dependencies> </dependencyManagement> <!--所有聲明在父項(xiàng)目 dependencies 中的依賴都會(huì)自動(dòng)引入,并默認(rèn)被所有子項(xiàng)目繼承--> <!--即使在子項(xiàng)目中不引入該依賴,那么子項(xiàng)目依然會(huì)從父項(xiàng)目中繼承該依賴項(xiàng)。--> <dependencies> </dependencies> <!--發(fā)現(xiàn)依賴和擴(kuò)展的遠(yuǎn)程倉(cāng)庫(kù)列表 --> <!--遠(yuǎn)程倉(cāng)庫(kù)列表,它是Maven用來(lái)填充本地倉(cāng)庫(kù)所使用的一組遠(yuǎn)程項(xiàng)目。 --> <repositories> <!--包含需要連接到遠(yuǎn)程倉(cāng)庫(kù)的信息--> <repository> <id>spring-milestones</id> <name>Spring Milestones</name> <url>https://repo.spring.io/milestone</url> </repository> </repositories> <!--用于項(xiàng)目打包,打包需要的插件--> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
1、聚合主要是為了方便快速構(gòu)建項(xiàng)目,繼承主要是為了消除重復(fù)配置
2、對(duì)于聚合模塊而言,它知道有哪些被聚合的模塊,但那些被聚合的模塊不知道這個(gè)聚合模塊的存在;對(duì)于繼承的父pom 而言,它不知道有哪些子模塊繼承它,但那些子模塊都必須知道自己的父pom 是什么
3、聚合pom 與繼承中的父pom 的 packaging 都必須是 pom;同時(shí),聚合模塊與繼承中的父模塊除了 pom 外,都沒(méi)有實(shí)際的內(nèi)容
Maven的依賴機(jī)制會(huì)導(dǎo)致Jar包的沖突。
舉個(gè)例子,現(xiàn)在你的項(xiàng)目中,使用了兩個(gè)Jar包,分別是A和B?,F(xiàn)在A需要依賴另一個(gè)Jar包C,B也需要依賴C。但是A依賴的C的版本是1.0,B依賴的C的版本是2.0。這時(shí)候,Maven會(huì)將這1.0的C和2.0的C都下載到你的項(xiàng)目中,這樣你的項(xiàng)目中就存在了不同版本的C,這時(shí)Maven會(huì)依據(jù)依賴路徑最短優(yōu)先原則,來(lái)決定使用哪個(gè)版本的Jar包,而另一個(gè)無(wú)用的Jar包則未被使用,這就是所謂的依賴沖突。
1.第一聲明者優(yōu)先原則:
在pom文件定義依賴,以先聲明的依賴為準(zhǔn)。
誰(shuí)先在pom.xml中申明,就用誰(shuí)的。跟坐標(biāo)代碼的順序有關(guān)
2.路徑近者優(yōu)先原則:
以上兩個(gè)jar包都依賴了spring-beans。
spring-context和spring-webmvc都會(huì)傳遞過(guò)來(lái)spring-beans,那如果直接把spring-beans的依賴寫(xiě)在pom文件中,那么項(xiàng)目就不會(huì)再使用其他依賴傳遞過(guò)來(lái)的spring-beans。
因?yàn)樽约褐苯釉趐om中定義spring-beans要比其他依賴傳遞過(guò)來(lái)的路徑要近。
3.排除依賴原則:
使用Maven中的<exclusions>標(biāo)簽,例如
<!--使用的openfeign--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> <version>2.2.1.RELEASE</version> <exclusions> <exclusion> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-ribbon</artifactId> </exclusion> </exclusions> </dependency>
4.鎖定版本原則:
面對(duì)眾多的依賴,有一種方法不用考慮依賴路徑、聲明優(yōu)化等因素可以采用直接鎖定版本的方法確定依賴構(gòu)件的版本,版本鎖定后則不考慮依賴的聲明順序或依賴的路徑,以鎖定的版本的為準(zhǔn)添加到工程中,此方法在企業(yè)開(kāi)發(fā)中常用。
在idea中下載插件mavenHelper解決依賴沖突,使用步驟看圖
找到?jīng)_突,點(diǎn)擊右鍵,然后選擇Exclude即可排除沖突版本的Jar包。
“Maven的基礎(chǔ)知識(shí)整理”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。