Maven是什么?Maven的概念+作用+倉(cāng)庫(kù)的介紹+常用命令的詳解
Maven系列1
1.什么是Maven?
Maven是一個(gè)項(xiàng)目管理工具,它包含了一個(gè)對(duì)象模型。一組標(biāo)準(zhǔn)集合,一個(gè)依賴管理系統(tǒng)。和用來(lái)運(yùn)行定義在生命周期階段中插件目標(biāo)和邏輯。
核心功能
Maven的核心功能是合理敘述項(xiàng)目間的依賴關(guān)系,通俗點(diǎn) 就是通過(guò)pom.xml文件的配置獲取jar包不用手動(dòng)的去添加jar包,,這個(gè)pom.xml包我后面會(huì)敘述,不過(guò)已經(jīng)學(xué)習(xí)過(guò)maven的 人應(yīng)該對(duì)這個(gè)很熟悉。其本質(zhì)就是通過(guò)配置pom.xml來(lái)獲取jar包,當(dāng)然這是在該項(xiàng)目必須是maven項(xiàng)目的前提下。那么什么是maven項(xiàng)目
maven項(xiàng)目是啥?
我們這樣來(lái)理解maven項(xiàng)目,就是在java項(xiàng)目和web項(xiàng)目上裹了一層maven,本質(zhì)上java項(xiàng)目還是java項(xiàng)目,web項(xiàng)目還是web項(xiàng)目,但是包裹了maven之后,就可以使用maven提供的一些功能,即通過(guò)pom.xml添加jar包
就像在蜜汁雞外面裹了一層面粉油炸一下變成了炸雞,但是他還是一只雞
2.Maven能夠解決什么問(wèn)題
在想Maven可以解決什么問(wèn)題之前我們先來(lái)想想我們開發(fā)過(guò)程中經(jīng)常遇到什么問(wèn)題
1、我們需要引用各種 jar 包,尤其是比較大的工程,引用的 jar 包往往有幾十個(gè)乃至上百個(gè), 每用到一種 jar 包,都需要手動(dòng)引入工程目錄,而且經(jīng)常遇到各種讓人抓狂的 jar 包沖突,版本沖突。
2、我們辛辛苦苦寫好了 Java 文件,可是只懂 0 和 1 的白癡電腦卻完全讀不懂,需要將它編譯成二進(jìn)制字節(jié)碼。好歹現(xiàn)在這項(xiàng)工作可以由各種集成開發(fā)工具幫我們完成,Eclipse、IDEA 等都可以將代碼即時(shí)編譯。當(dāng)然,如果你嫌生命漫長(zhǎng),何不鋪張,也可以用記事本來(lái)敲代碼,然后用 javac 命令一個(gè)個(gè)地去編譯,逗電腦玩。
3、世界上沒(méi)有不存在 bug 的代碼,計(jì)算機(jī)喜歡 bug 就和人們總是喜歡美女帥哥一樣。為了追求美為了減少 bug,因此寫完了代碼,我們還要寫一些單元測(cè)試,然后一個(gè)個(gè)的運(yùn)行來(lái)檢驗(yàn)代碼質(zhì)量。
4、再優(yōu)雅的代碼也是要出來(lái)賣的。我們后面還需要把代碼與各種配置文件、資源整合到一起,定型打包,如果是 web 項(xiàng)目,還需要將之發(fā)布到服務(wù)器,供人蹂躪。
maven所幫助我們解決的問(wèn)題
以上的這些問(wèn)題maven都把我們解決了,沒(méi)錯(cuò)maven可以幫我們
1構(gòu)建工程,
2管理jar,
3.編譯代碼,
4.自動(dòng)運(yùn)行單元測(cè)試,
5.打包
6.生成報(bào)表,
7.部署項(xiàng)目,生成web站點(diǎn)。
有沒(méi)有孫悟空得到金箍棒的感覺(jué)
3.接下來(lái)我就舉個(gè)例子讓大家先見識(shí)見識(shí)maven的功能
前面我們通過(guò)web階段的項(xiàng)目,要能夠?qū)㈨?xiàng)目運(yùn)行起來(lái),就必須將該項(xiàng)目所依賴的一些jar包添加到工程中,否則項(xiàng)目就不可以運(yùn)行了,如果相同架構(gòu)的項(xiàng)目有十幾個(gè),那么我們就需要將這一份jar包復(fù)制到十個(gè)不同的工程中我們一起來(lái)看看CRM工程的大小
使用傳統(tǒng)的CRM項(xiàng)目
使用maven構(gòu)建
4.Maven的依賴管理
為什么使用maven之后文件夾就如此之小了呢?其實(shí)這我們?cè)谇懊婢吞岬竭^(guò)了即通過(guò)配置pom.xml的文件來(lái)配置依賴,而Maven的一個(gè)核心特征就是依賴管理,當(dāng)我們涉及到多模塊的項(xiàng)目(包含成百個(gè)模塊或者子項(xiàng)目),管理依賴就變成了一個(gè)極為困難的任務(wù)Maven展示出了他對(duì)處理這種情形的高度控制
傳統(tǒng)的web項(xiàng)目中,我們必須將工程所依賴的jar包復(fù)制到工程中,導(dǎo)致工程變的很大,那么maven是如何通過(guò)操作使工程變少的呢
通過(guò)圖解可以發(fā)現(xiàn)maven工程不直接將jar包導(dǎo)入到工程中,而是通過(guò)再pom.xml中添加所需的jar包的坐標(biāo),這樣就避免了jar直接引入進(jìn)來(lái),在需要用到j(luò)ar包的時(shí)候,只要查找pom.xml文件,再通過(guò)pom.xml中的坐標(biāo),到一個(gè)專門用于存放jar包的倉(cāng)庫(kù)中根據(jù)坐標(biāo)從而找到這些jar包,再把這些jar包拿去運(yùn)行
看到這讀者們可能會(huì)有疑問(wèn)
1.存放jar包的倉(cāng)庫(kù)長(zhǎng)什么樣?
這個(gè)我們會(huì)在后面一一講解,倉(cāng)庫(kù)也分為許多種類
2.通過(guò)讀取pom.xml坐標(biāo),來(lái)找jar的方式會(huì)不會(huì)導(dǎo)致速度很慢。從而導(dǎo)致這些方案不可行
通過(guò) pom.xml 文件配置要引入的 jar 包的坐標(biāo),再讀取坐標(biāo)并到倉(cāng)庫(kù)中加載 jar 包,這
樣我們就可以直接使用 jar 包了,為了解決這個(gè)過(guò)程中速度慢的問(wèn)題,maven 中也有索引的概念,通過(guò)建立索引,可以大大提高加載 jar 包的速度,使得我們認(rèn)為 jar 包基本跟放在本地的工程文件中再讀取出來(lái)的速度是一樣的。這個(gè)過(guò)程就好比我們查閱字典時(shí),為了能夠加快查找到內(nèi)容,書前面的目錄就好比是索引,有了這個(gè)目錄我們就可以方便找到內(nèi)容了,一樣的在 maven 倉(cāng)庫(kù)中有了索引我們就可以認(rèn)為可以快速找到 jar 包。
5.倉(cāng)庫(kù)的概念
倉(cāng)庫(kù)就是存放jar包的地方,即我們前面說(shuō)的通過(guò)pom.xml中通過(guò)設(shè)置索引來(lái)到倉(cāng)庫(kù)中尋找jar包
倉(cāng)庫(kù)分為:本地倉(cāng)庫(kù),第三方倉(cāng)庫(kù),中央倉(cāng)庫(kù)
5.1本地倉(cāng)庫(kù)
用來(lái)存儲(chǔ)從遠(yuǎn)程倉(cāng)庫(kù)或者中央倉(cāng)庫(kù)下載的插件和jar包,項(xiàng)目使用一些插件或jar包
優(yōu)先從本地倉(cāng)庫(kù)查找
默認(rèn)本地倉(cāng)庫(kù)的位置在${user.dir}/.m2/repository,${user.dir}表示 windows 用戶目錄。
5.2第三方倉(cāng)庫(kù)
d第三方倉(cāng)庫(kù),又稱為內(nèi)部中心倉(cāng)庫(kù),又稱為私服
私服:一般由公司自己設(shè)立,只為本公司內(nèi)部共享使用,它既可以作為公司內(nèi)部構(gòu)建協(xié)作和存檔,也可作為公用類庫(kù)鏡像緩存,減少在外部訪問(wèn)和下載的頻率使用私服為了減少對(duì)中央倉(cāng)庫(kù)的訪問(wèn)私服可以使用的是局域網(wǎng),中央倉(cāng)庫(kù)必須使用外網(wǎng)。也就是一般公司都會(huì)創(chuàng)建這種第三方倉(cāng)庫(kù),保證項(xiàng)目開發(fā)時(shí),項(xiàng)目所需用的jar都從該倉(cāng)庫(kù)中拿,每個(gè)人的版本就都一樣。
注意:連接私服,需要單獨(dú)配置。如果沒(méi)有配置私服,默認(rèn)不使用
5.3中央倉(cāng)庫(kù)
在 maven 軟件中內(nèi)置一個(gè)遠(yuǎn)程倉(cāng)庫(kù)地址 http://repo1.maven.org/maven2 ,它是中央倉(cāng)庫(kù),服務(wù)于整個(gè)互聯(lián)網(wǎng),它是由 Maven 團(tuán)隊(duì)自己維護(hù),里面存儲(chǔ)了非常全的 jar 包,它含了世界上大部分流行的開源項(xiàng)目構(gòu)件。
獲取jar包的過(guò)程
優(yōu)先從本地倉(cāng)庫(kù)查找,如果本地倉(cāng)庫(kù)沒(méi)有該jar包,如果配置了私服,就從私服中查找,私服中沒(méi)有就從中央倉(cāng)庫(kù)中查找,然后下載到本地倉(cāng)庫(kù),下次使用就可以直接從本地倉(cāng)庫(kù)中查找,沒(méi)有配置私服則,直接從中央倉(cāng)庫(kù)中查找
6.Maven java項(xiàng)目結(jié)構(gòu)
Maven工程目錄結(jié)構(gòu)
圖中有一個(gè)target目錄,是因?yàn)閷⒃搄ava項(xiàng)目進(jìn)行了編譯,src/main/java下的源代碼就會(huì)編譯成.class文件放入target目錄中,target就是輸出目錄。
作為一個(gè) maven 工程,它的 src 目錄和 pom.xml 是必備的。
進(jìn)入 src 目錄后,我們發(fā)現(xiàn)它里面的目錄結(jié)構(gòu)如下:
項(xiàng)目名稱
--pom.xml 核心配置,項(xiàng)目根下
--src
--main
--java java源碼目錄
--resources java配置文件目錄
--test
--java 源碼測(cè)試目錄
--resource 測(cè)試配置目錄
7.maven的常用命令
7.1 compile
compile是maven工程的編譯命令,作用是將 src/main/java 下的文件編譯為 class 文件輸出到 target
目錄下。
7.2 test
test是maven工程的測(cè)試命令,會(huì)執(zhí)行 src/test/java 下的單元測(cè)試類。
cmd 執(zhí)行 mvn test 執(zhí)行 src/test/java 下單元測(cè)試類,下圖為測(cè)試結(jié)果,運(yùn)行 1 個(gè)測(cè)試用例,全部成功。
7.3 clean
clean是maven工程的清理命令,執(zhí)行clean會(huì)刪除target目錄及其內(nèi)容
7.4 package
package是maven工程的打包命令,對(duì)于java工程執(zhí)行 package 打成 jar 包,對(duì)于 web 工程打成 war
包。
7.5 install
install 是 maven 工程的安裝命令,執(zhí)行 install 將 maven 打成 jar 包或 war 包發(fā)布到本地倉(cāng)庫(kù)。
從運(yùn)行結(jié)果中,可以看出:當(dāng)后面的命令執(zhí)行時(shí),前面的操作過(guò)程也都會(huì)自動(dòng)執(zhí)行
8.maven的生命周期
maven對(duì)項(xiàng)目構(gòu)建過(guò)程分為三套相互獨(dú)立的生命周期,這里說(shuō)的三套而且是相互獨(dú)立,
這三套分別是:
Clean Lifecycle :在進(jìn)行真正的構(gòu)建之前進(jìn)行一些清理工作。
Default Lifecycle :構(gòu)建的核心部分,編譯,測(cè)試,打包,部署等等。
Site Lifecycle :生成項(xiàng)目報(bào)告,站點(diǎn),發(fā)布站點(diǎn)。
9.maven的概念模型
Maven 包含了一個(gè)項(xiàng)目對(duì)象模型 (Project Object Model),一組標(biāo)準(zhǔn)集合,一個(gè)項(xiàng)目生命周期(Project
Lifecycle),一個(gè)依賴管理系統(tǒng)(Dependency Management System),和用來(lái)運(yùn)行定義在生命周期階段
(phase)中插件(plugin)目標(biāo)(goal)的邏輯。
9.1項(xiàng)目對(duì)象模型:
一個(gè)maven工程都有一個(gè)pom.xml文件。通過(guò)pom.xml文件定義項(xiàng)目的坐標(biāo),項(xiàng)目的依賴,項(xiàng)目的信息
插件目標(biāo)等
9.2依賴管理系統(tǒng):
通過(guò) maven 的依賴管理對(duì)項(xiàng)目所依賴的 jar 包進(jìn)行統(tǒng)一管理。
比如:項(xiàng)目依賴 junit4.9,通過(guò)在 pom.xml 中定義 junit4.9 的依賴即使用 junit4.9,如下所示是 junit4.9
的依賴定義:
<!-- 依賴關(guān)系 --> <dependencies> <!-- 此項(xiàng)目運(yùn)行使用 junit,所以此項(xiàng)目依賴 junit --> <dependency> <!-- junit 的項(xiàng)目名稱 --> <groupId>junit</groupId> <!-- junit 的模塊名稱 --> <artifactId>junit</artifactId> <!-- junit 版本 --> <version>4.9</version> <!-- 依賴范圍:?jiǎn)卧獪y(cè)試時(shí)使用 junit --> <scope>test</scope> </dependency>
9.3 一個(gè)項(xiàng)目的生命周期
使用maven完成項(xiàng)目的構(gòu)建,項(xiàng)目構(gòu)建包括:清理,編譯,部署等過(guò)程,maven將這些過(guò)程規(guī)范為一個(gè)生命周期,如下所示是生命周期的各階段
maven 通過(guò)執(zhí)行一些簡(jiǎn)單命令即可實(shí)現(xiàn)上邊生命周期的各各過(guò)程,比如執(zhí)行 mvn compile 執(zhí)行編譯、
執(zhí)行 mvn clean 執(zhí)行清理。
9.4 一組標(biāo)準(zhǔn)集合
maven將整個(gè)項(xiàng)目管理過(guò)程定義為一組標(biāo)準(zhǔn)集合,比如通過(guò)maven構(gòu)建工程有標(biāo)準(zhǔn)的目錄結(jié)構(gòu),有標(biāo)準(zhǔn)的生命周期階段,依賴管理有標(biāo)準(zhǔn)的坐標(biāo)定義
9.5 插件目標(biāo)
maven管理項(xiàng)目生命周期都是基于插件完成的
10.使用idea開發(fā)meven項(xiàng)目
這個(gè)就是幾個(gè)簡(jiǎn)單的參數(shù)配置一下沒(méi)什么東西講,我就放個(gè)流程圖好了
1.
2.
3.
6.
7.
8.
9.
10.
11.
11.獲取jar包方式
到中央倉(cāng)庫(kù)的官網(wǎng)上去下載
網(wǎng)址:
http://search.maven.org/
http://mvnrepository.com/
例圖:
以上就是maven的一些基礎(chǔ)知識(shí),后續(xù)我會(huì)更新更高階的maven知識(shí)
,即我們?cè)陧?xiàng)目中經(jīng)常使用到的。
到此這篇關(guān)于Maven是什么?Maven的概念+作用+倉(cāng)庫(kù)的介紹+常用命令的文章就介紹到這了,更多相關(guān)Maven常用命令內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java+io+swing實(shí)現(xiàn)學(xué)生信息管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了java+io+swing實(shí)現(xiàn)學(xué)生信息管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-07-07RabbitMQ冪等性與優(yōu)先級(jí)及惰性詳細(xì)全面講解
關(guān)于MQ消費(fèi)者的冪等性問(wèn)題,在于MQ的重試機(jī)制,因?yàn)榫W(wǎng)絡(luò)原因或客戶端延遲消費(fèi)導(dǎo)致重復(fù)消費(fèi)。使用MQ重試機(jī)制需要注意的事項(xiàng)以及如何解決消費(fèi)者冪等性與優(yōu)先級(jí)及惰性問(wèn)題以下將逐一講解2022-11-11