maven详解2020
maven概述
1.概念
Maven這個(gè)單詞來自于意第緒語(yǔ)(猶太語(yǔ)),意為知識(shí)的積累,最初在Jakata Turbine項(xiàng)目中用來簡(jiǎn)化構(gòu)建過程。當(dāng)時(shí)有一些項(xiàng)目(有各自Ant build文件),僅有細(xì)微的差別,而JAR文件都由CVS來維護(hù)。于是希望有一種標(biāo)準(zhǔn)化的方式構(gòu)建項(xiàng)目,一個(gè)清晰的方式定義項(xiàng)目的組成,一個(gè)容易的方式發(fā)布項(xiàng)目的信息,以及一種簡(jiǎn)單的方式在多個(gè)項(xiàng)目中共享JARs。于是maven誕生了。
在我們的日常項(xiàng)目中,maven不僅是一個(gè)依賴管理工具,有效的幫我們管理項(xiàng)目中需要使用到的各種依賴,也是一個(gè)項(xiàng)目構(gòu)建工具,可以通過其內(nèi)置的項(xiàng)目模板(也稱為骨架 archetype),構(gòu)建常規(guī)的項(xiàng)目(jar war等)。使用的maven項(xiàng)目的對(duì)象模型(pom-project object model),可以通過一小段描述信息來管理項(xiàng)目的構(gòu)建,報(bào)告和文檔的管理。
2.為什么要用maven
這里舉個(gè)生活中的例子,比如此時(shí)的你想要配一臺(tái)主機(jī)來玩游戲,那么你需要去選購(gòu)組成這個(gè)主機(jī)的各種配件,進(jìn)而需要去了解各種配件的性能,配件之間的兼容性,組裝好后還需要自己裝操作系統(tǒng)和驅(qū)動(dòng)程序,這使得不熟悉組裝電腦主機(jī)的你需要花費(fèi)大量的時(shí)間,最后的結(jié)果還可能是你的主機(jī)運(yùn)行不穩(wěn)定,經(jīng)常藍(lán)屏。在這個(gè)時(shí)候突然有個(gè)人告訴你,你可以去某個(gè)知名的電商平臺(tái),你可以瀏覽一下主流的機(jī)型,選擇了你需要的配置,然后下單、付款。接著PC供應(yīng)商幫我組裝電腦、安裝操作系統(tǒng)和驅(qū)動(dòng)程序,物流公司將電腦送到我的家里,你接上顯示器、電源、鼠標(biāo)和鍵盤就能直接使用了。這為你節(jié)省了大量時(shí)間,而且這臺(tái)電腦十分穩(wěn)定,商家在把電腦發(fā)送給你之前已經(jīng)進(jìn)行了很好的測(cè)試。這難道不香嗎?
在日常的團(tuán)隊(duì)開發(fā)中,這種找配件組裝"主機(jī)"的方式,顯得更雜亂無(wú)序,既無(wú)法有效的確保依賴之間的兼容性,又不能保證資源的重用型,且無(wú)法擺脫對(duì)代碼工具的依賴,對(duì)于大型項(xiàng)目的開發(fā),框架的整合,依賴的管理帶來了很大的困擾。而使用maven這個(gè)強(qiáng)大的依賴管理,項(xiàng)目工具,你的問題將迎刃而解,它將幫我們完成,自動(dòng)關(guān)聯(lián),拉取依賴,升級(jí)框架,依賴有效管理,自動(dòng)測(cè)試,打包部署等,所以我們要說maven :yes。
maven安裝與簡(jiǎn)單使用
1.安裝
1.1 下載
前往https://maven.apache.org/download.cgi下載最新版的Maven程序
1.2 解壓與環(huán)境變量的配置
然后將文件解壓到你自己想要存放的目錄下(如D:\Program Files (x86)\apache-maven-3.6.1):
環(huán)境變量配置:
新建環(huán)境變量MAVEN_HOME,賦值D:\Program Files (x86)\apache-maven-3.6.1
編輯環(huán)境變量Path,追加%MAVEN_HOME%\bin;
至此,maven已經(jīng)完成了安裝,我們可以通過DOS命令檢查一下我們是否安裝成功:
1.3 修改本地倉(cāng)庫(kù)及鏡像
maven倉(cāng)庫(kù)引用結(jié)構(gòu)
本地倉(cāng)庫(kù)(local)->自己在磁盤創(chuàng)建的用以存放資源的文件夾;
私服鏡像(aliyun)->常使用國(guó)內(nèi)資源鏡像,提升資源拉取速度;
中央倉(cāng)庫(kù)central->maven官方倉(cāng)庫(kù)資源。
maven資源拉取方式
在maven的pom配置文件中國(guó)配置項(xiàng)目所需的依賴,在項(xiàng)目保存時(shí),maven將自動(dòng)通過你配置的坐標(biāo)路徑去拉取依賴資源,首先會(huì)去掃描本地倉(cāng)庫(kù),若有,直接獲取,若無(wú),將會(huì)前往所配置的私服鏡像去拉取相關(guān)的依賴資源。
倉(cāng)庫(kù)配置
進(jìn)入你的maven文件安裝目錄,找到conf配置文件夾,修改setting.xml,修改本地倉(cāng)庫(kù)位置
修改鏡像源,拉取國(guó)內(nèi)資源的路徑配置 setting.xml
通過以上步驟,已經(jīng)完成了maven的安裝與簡(jiǎn)單配置。
1.4 maven常用命令
maven comand
// 編譯源代碼 mvn compile // 運(yùn)行測(cè)試 mvn test // 項(xiàng)目打包 mvn package // 清除產(chǎn)生的項(xiàng)目 mvn clean //項(xiàng)目打包時(shí)跳過測(cè)試 mvn package -Dmaven.test.skip=ture1.5 maven坐標(biāo)
maven pointer
//定義當(dāng)前 Maven 項(xiàng)目從屬的實(shí)際項(xiàng)目,表述形式同 Java 包名的表述方式類似,通常與域名反向一一對(duì)應(yīng) groupId //定義實(shí)際項(xiàng)目中的一個(gè) Maven 項(xiàng)目(實(shí)際項(xiàng)目中的一個(gè)模塊),表述形式為當(dāng)前項(xiàng)目名 artifactId //定義 Maven 當(dāng)前所處的版本 version //定義 Maven 項(xiàng)目的打包方式 packaging //定義構(gòu)件輸出的附屬構(gòu)件 classifier //依賴描述: type: 依賴的類型 scope: 依賴的范圍 optional: 標(biāo)記依賴是否可選 exclusions: 用來排除傳遞性依賴2.maven使用
2.1 構(gòu)建一個(gè)簡(jiǎn)單的項(xiàng)目
簡(jiǎn)單的java se項(xiàng)目 jar
# 在你的磁盤中新建文件加,用以存放maven創(chuàng)建的項(xiàng)目 然后cmd 切換到你的文件夾路徑,執(zhí)行以下代碼片段 # 生成java se 項(xiàng)目 mvn archetype:generate -DarchetypeCatalog=internal -DgroupId=com.zglt.build -DartifactId=demo # cmd 切換到你的項(xiàng)目路徑下即在pom.xml的目錄下運(yùn)行以下代碼 mvn clean compile exec:java -Dexec.mainClass="com.zglt.build.App" # 將項(xiàng)目程序打包,用以發(fā)布 mvn packagemaven構(gòu)建普通項(xiàng)目的結(jié)構(gòu)
└─src classPath項(xiàng)目源碼根目錄├─main 主要│ ├─java java源碼│ │ └─com │ │ └─zglt│ │ └─build com.zglt.build包名│ └─resources 資源: 配置文件(約定優(yōu)于配置)└─test 用于單元測(cè)試的相關(guān)包└─java└─com└─zglt└─build pom.xml 項(xiàng)目對(duì)象模型配置(依賴管理等)pom.xml配置
<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><!-- 坐標(biāo) ,描述項(xiàng)目的信息--><groupId>com.zglt.build</groupId><!-- 團(tuán)隊(duì)信息,組id--><artifactId>demo</artifactId><!-- 項(xiàng)目名--><version>1.0-SNAPSHOT</version><!-- 項(xiàng)目版本--><!-- 打包類型 --><packaging>jar</packaging><!-- 項(xiàng)目名 --><name>demo</name><!-- 官方網(wǎng)站 --><url>http://maven.apache.org</url><!-- 項(xiàng)目屬性 --><properties><!-- 項(xiàng)目構(gòu)建時(shí)的字符編碼集 --><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><!-- 依賴: druid gson --><dependencies><!-- 單元測(cè)試工具包 ,使用dependency標(biāo)簽配置項(xiàng)目所需要的依賴,需要描述所需依賴的坐標(biāo),maven將通過配置的坐標(biāo)自動(dòng)去倉(cāng)庫(kù)拉取對(duì)應(yīng)的依賴--><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>3.8.1</version><scope>test</scope></dependency></dependencies> </project>maven生命周期
1.概念
maven基于構(gòu)建生命周期的中心概念,定義了項(xiàng)目構(gòu)建的每一個(gè)階段過程,對(duì)于構(gòu)建項(xiàng)目的人員,這意味著只需要學(xué)習(xí)一小堆命令即可構(gòu)建任何Maven項(xiàng)目,POM將確保他們獲得所需的結(jié)果。
2.默認(rèn)生命周期
檢驗(yàn)
(validate) - 驗(yàn)證項(xiàng)目是否正確,所有必要的信息是否可用;
初始化
(initialize)項(xiàng)目文件配置初始化;
編譯
(compile) - 編譯項(xiàng)目的源代碼;
單元測(cè)試
(test) - 使用合適的單元測(cè)試框架測(cè)試編譯的源代碼(這些測(cè)試不應(yīng)該要求代碼被打包或部署)
打包
(package) - 采用編譯的代碼,并以其可分配格式(如JAR)進(jìn)行打包;
集成測(cè)試
(verify) - 對(duì)集成測(cè)試的結(jié)果執(zhí)行任何檢查,以確保滿足質(zhì)量標(biāo)準(zhǔn);
安裝
(install) - 將軟件包安裝到本地存儲(chǔ)庫(kù)中,用作本地其他項(xiàng)目的依賴項(xiàng);
部署
(deploy) - 在構(gòu)建環(huán)境中完成,將最終的包復(fù)制到遠(yuǎn)程存儲(chǔ)庫(kù)以與其他開發(fā)人員和項(xiàng)目共享。
maven依賴管理
1.依賴范圍
a.compile 默認(rèn)的范圍,編譯測(cè)試運(yùn)行都有效;
b.provided 編譯和測(cè)試時(shí)有效,最后是在運(yùn)行的時(shí)候不會(huì)被加入,如servlet api;
c.runtime 在測(cè)試和運(yùn)行時(shí)有效,如MYSQL JDBC DRIVER;
d.test 在測(cè)試時(shí)有效,如junit;
e. system 與本機(jī)系統(tǒng)相關(guān)聯(lián),編譯/測(cè)試/運(yùn)行時(shí)有效;
f. import 導(dǎo)入的范圍,它只在使用dependencyManagement中,表示從其他pom中導(dǎo)入dependecy的配置。
2.依賴傳遞
在maven中,依賴是可以傳遞的,就是說假設(shè)存在三個(gè)項(xiàng)目,分別是項(xiàng)目c,項(xiàng)目b以及項(xiàng)目a,假設(shè)a依賴于b,b依賴于c,那么我們可以根據(jù)Maven項(xiàng)目依賴的特征不難推出項(xiàng)目a也依賴于c(只有編譯時(shí)和運(yùn)行時(shí)依賴是傳遞的),所謂的傳遞依賴,簡(jiǎn)單的說,a的運(yùn)行需要b的存在,那么a依賴于b,而b的運(yùn)行又需要c的存在,那么b依賴于c,根據(jù)需求傳遞,那么可以推出a的運(yùn)行需要c的存在。
3.依賴沖突
同理在一個(gè)項(xiàng)目中,既然存在依賴之間的傳遞,那么當(dāng)依賴發(fā)生沖突的時(shí)候,maven又是怎么進(jìn)行依賴管理的呢,我們舉例說明什么是依賴沖突,假設(shè)有如下的依賴樹:
最短路徑原則
A | B | | | C | C可以看出項(xiàng)目A存在有2個(gè)直接的依賴B,C和一個(gè)間接的依賴C,此時(shí)對(duì)于項(xiàng)目A來說,將會(huì)有兩個(gè)版本的C,從而產(chǎn)生版本沖突,也就是是所說的依賴沖突,maven在解決如下沖突時(shí),使用最短路徑原則,亦即這里的A項(xiàng)目將直接依賴最短路徑的C。
優(yōu)先聲明原則
A | B | | | C 1.0 優(yōu)先 | E | | | C 2.0可以看出項(xiàng)目A存在有2個(gè)直接的依賴B,E和2個(gè)間接的依賴C,此時(shí)對(duì)于項(xiàng)目A來說,將會(huì)有兩個(gè)版本的C且路徑距離相同,從而產(chǎn)生依賴沖突,maven在解決如下沖突時(shí),使用優(yōu)先聲明原則,亦即這里的A項(xiàng)目將直接依賴于優(yōu)先在pom中聲明的C 1.0版本。
總結(jié)
以上是生活随笔為你收集整理的maven详解2020的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。