下載和安裝
1:官方下載地址:http://maven.apache.org/download.cgi示辈,選擇windown版本下載并解壓到你想安裝的目錄
2:需要配置jdk環(huán)境變量庞钢,maven就是java語言寫的撕予,所以前提是必須配置java的環(huán)境變量
?????? Maven3.2 要求 JDK 1.6 或以上版本, 而 Maven 3.0/3.1 需要 JDK 1.5 或以上
3:Maven環(huán)境變量配置
4:驗證是否安裝成功版确,通過cmd命令窗口運行mvn-v進行查看
Maven基本概念的理解
那么maven中的jar包又是從哪來的呢另玖?
倉庫:存放構(gòu)件( Maven的插件拙徽、自己開發(fā)的項目的模塊袭蝗,第三方框架或工具的jar包)的地方。
????????????? ①本地倉庫:本地本機放置構(gòu)件的地方哺窄。Maven從遠程倉庫下載下來的構(gòu)件捐下,都存放在本? ??????? 地倉庫中,項目可以從本地Maven倉庫中獲取自己所依賴的文件萌业,為當(dāng)前本??????????????? ? ????????機電腦上的所有Maven工程服務(wù)坷襟。
? ? ??????? 默認位置為系統(tǒng)用戶下\.m2\repository
????????????? ②遠程倉庫:
? ??????? a中央倉庫:架設(shè)在Internet上,為全世界所有Maven工程服務(wù)生年。
? ? http://central.maven.org/maven2/
? ??????? b私服:架設(shè)在當(dāng)前局域網(wǎng)環(huán)境下婴程,為當(dāng)前局域網(wǎng)范圍內(nèi)的所有Maven工程服務(wù)
? ??????? c 鏡像:架設(shè)在各個大洲,為中央倉庫分擔(dān)流量抱婉,減輕中央倉庫的壓力档叔,同時更快的響? ?? 應(yīng)用戶請求。
? ? ?? http://maven.aliyun.com/nexus/content/groups/public/
執(zhí)行maven命令的時候蒸绩,maven首先會到本地倉庫查找構(gòu)件
如果maven在本地倉庫中找不到構(gòu)件衙四,就會去連接外網(wǎng),到中央倉庫去查找
如果無法聯(lián)網(wǎng)或者找不到構(gòu)件患亿,則構(gòu)建失敗
settings.xml文件
Maven基本概念的理解
坐標(biāo):每個maven所依賴的庫或者是maven項目都有一個唯一的標(biāo)識传蹈,這個標(biāo)識就是坐標(biāo)。它的作用是讓Maven在倉庫中找到對應(yīng)的構(gòu)件
例如:在一個平面中使用x步藕、y兩個向量可以唯一的確定平面中的一個點惦界。
? ? 在空間中使用x、y咙冗、z三個向量可以唯一的確定空間中的一個點沾歪。
1 groupid:公司或組織的域名倒序+當(dāng)前項目名稱
2 artifactId:當(dāng)前項目的模塊名稱
3 version:當(dāng)前模塊的版本
如何通過坐標(biāo)到倉庫中查找jar包?
1 將gav三個向量連起來com.test.maven+Hello+0.0.1-SNAPSHOT?
2 以連起來的字符串作為目錄結(jié)構(gòu)到倉庫中查找com/test/maven/Hello/0.0.1-SNAPSHOT/Hello-0.0.1-SNAPSHOT.jar?
注意:我們自己的Maven工程必須執(zhí)行安裝操作才會進入本地倉庫雾消。安裝的命令是:mvn install
Pom.xml文件
Maven核心概念
Maven能夠?qū)崿F(xiàn)自動化構(gòu)建和依賴管理與內(nèi)部機制密不可分灾搏,想掌握Maven為什么能自動化構(gòu)建和實現(xiàn)依賴管理挫望,必須了解Maven的九個核心概念
1?POM
2?約定的目錄機構(gòu)
3?坐標(biāo)
4?依賴
5?倉庫
6?生命周期
7?插件和目標(biāo)
8?繼承
9? 聚合
POM
POM(Project Object Model):項目對象模型。
將Java工程的相關(guān)信息封裝為對象作為便于操作和管理的模型确镊。
類比Java OOP:在java中一切皆為對象士骤,包含屬性和方法(行為),它大大地降低了軟件開發(fā)的難度蕾域,使編程就像搭積木一樣簡單拷肌。
它是 Maven 中工作的基本單位,這是一個XML文件旨巷。
學(xué)習(xí)Maven就是學(xué)習(xí)pom.xml文件中的配置巨缘,pom.xml文件用來包含各種配置信息,POM也包含了目標(biāo)和插件采呐。
在執(zhí)行任務(wù)或目標(biāo)時若锁,Maven 會使用當(dāng)前目錄中的
POM,讀取POM得到所需要的配置信息斧吐,然后執(zhí)行目標(biāo)又固。
超級POM:所有的POM繼承自父類,這個基礎(chǔ)的POM被稱為超級POM
約定的目錄結(jié)構(gòu)
為什么需要約定的目錄結(jié)構(gòu)
? ?maven負責(zé)我們項目的自動化構(gòu)建煤率,以編譯為例仰冠,maven想要自動編譯,那么必須知道java源文件保存的位置
? tip:我們在開發(fā)中如果需要讓第三方工具或框架知道我們自己創(chuàng)建的資源文件在哪蝶糯,那么基本上就是兩種方式:
? ? 1以配置的方式告訴工具或者框架
? ? spring à applicationContext.xml
? 2遵守約定?
? ? spring boot à application.properties
? 約定?配置?編碼:簡化開發(fā)???
? 架構(gòu)?框架?原始
? 意思就是能用配置解決的問題就不編碼洋只,能基于約定的就不進行配置。而Maven正是因為指定了特定文件保存的目錄才能夠?qū)ξ覀兊腏ava工程進行自動化構(gòu)建昼捍。
常用maven命令
mvnclean? ? ? 清理target
mvn compile? ? 編譯主程序
mvn test-compile? 編譯測試程序
mvntest? 執(zhí)行測試程序
mvn package? 打包
mvn install? 將打包的文件安裝到本地倉庫
mvndeploy? 將打包的文件發(fā)布到本地倉庫和遠程倉庫
tips:執(zhí)行與構(gòu)建過程相關(guān)的maven命令识虚,必須進入pom.xml所在的目錄
生命周期理解
什么是生命周期
? 開發(fā)項目的時候,不斷地在編譯妒茬、測試担锤、打包、部署等過程乍钻,maven的生命周期就是對所有構(gòu)建過程抽象與統(tǒng)一妻献,生命周期包含項目的清理、初始化团赁、編譯、測試谨履、打包欢摄、集成測試、驗證笋粟、部署怀挠、站點生成等幾乎所有的過程析蝴。
? Maven生命周期定義了各個構(gòu)建環(huán)節(jié)的執(zhí)行順序,Maven自動化的執(zhí)行構(gòu)建命令的基石绿淋。
tips:生命周期類比為java設(shè)計模式之模版方法模式abstract父類具體方法
生命周期的種類了解
提供的幾種生命周期
Maven有三套相互獨立的生命周期闷畸,分別是:
? 1Clean Lifecycle? 在進行構(gòu)建之前進行一些清理工作。
? 2Default Lifecycle? 構(gòu)建的核心部分吞滞,編譯佑菩,測試,打包裁赠,安裝殿漠,部署等等。
? 3Site Lifecycle? 生成項目報告佩捞,站點绞幌,發(fā)布站點。
它們是相互獨立的一忱,你可以調(diào)用clean來清理工作目錄莲蜘,僅僅調(diào)用site來生成站點。也可以直接運行mvn
clean install site 運行所有這三套生命周期帘营。
每套生命周期都由一組階段(Phase)組成票渠,我們平時在命令行輸入的命令總會對應(yīng)于一個特定的階段。?
tip:階段可以類比為java設(shè)計模式之模版方法模式abstract父類抽象方法
Clean生命周期
Clean生命周期一共包含了三個階段:
? 1pre-clean? 執(zhí)行一些需要在clean之前完成的工作
? 2clean? 移除所有上一次構(gòu)建生成的文件
? 3post-clean? 執(zhí)行一些需要在clean之后立刻完成的工作
Default生命周期
Default生命周期是Maven生命周期中最重要的一個仪吧,絕大部分工作都發(fā)生在這個生命周期中庄新。解釋一些比較重要和常用的階段:
validate
............
process-resources? 復(fù)制并處理資源文件,至目標(biāo)目錄薯鼠,準備打包择诈。
Compile? 編譯項目的源代碼。
............
process-test-resources? 復(fù)制并處理資源文件出皇,至目標(biāo)測試目錄羞芍。
test-compile ? ? 編譯測試源代碼。
............
test? 使用單元測試框架運行測試郊艘,這些測試代碼不會被打包或部署荷科。
............?
package ? 接受編譯好的代碼,打包成可發(fā)布的格式,如JAR。
............
Install? 將包安裝至本地倉庫竟终,以讓其它項目依賴勒虾。
Deploy? 將最終的包復(fù)制到遠程的倉庫,以讓其它開發(fā)人員與項目共享或部署到服務(wù)器上運行。
1 maven的核心程序只定義了抽象的生命周期
2 各個構(gòu)建環(huán)節(jié)有固定的順序,必須按照順序來執(zhí)行
3 不論執(zhí)行生命周期的那一個階段兜蠕,都是從生命周期最初的位置開始執(zhí)行
插件
什么是插件
Maven的核心僅僅定義了抽象的生命周期蝎毡,那么具體的任務(wù)是由誰實現(xiàn)的厚柳?
? 具體的任務(wù)都是由插件實現(xiàn)
tips:插件類比為java設(shè)計模式之模版方法模式繼承abstract父類的子類,實現(xiàn)抽象方法(某個階段)沐兵,做具體的事情
1 生命周期各個階段僅僅定義要執(zhí)行什么任務(wù)
2 Maven的生命周期與插件目標(biāo)相互綁定别垮,以完成某個具體的構(gòu)建任務(wù)
3 每個插件都能實現(xiàn)多個功能,每個功能就是一個插件目標(biāo)
隨著項目越來越大扎谎,我們需要將項目拆分成多個模塊:
? 1多個模塊之間如何調(diào)用和訪問呢碳想?
? 2多個模塊之間的復(fù)雜jar包關(guān)系又該如何管理呢?
依賴
什么是依賴
當(dāng)A jar包用到了B
jar包中的某些類時簿透,A就對B產(chǎn)生了依賴移袍。
為什么需要依賴?
如果不用依賴老充,我們需要將上面的包全部收到導(dǎo)入葡盗,在maven中只需要在pom.xml文件中配置dependency并可引用jar包
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.5.3 </version>
<scope>compile</scope>
</dependency>
依賴的范圍
依賴信息中除了目標(biāo)jar包的坐標(biāo)還有一個scope設(shè)置,這是依賴的范圍啡浊。
依賴的范圍有幾個可選值觅够,
compile、test巷嚣、provided喘先、 runtime、 system等
我們用得到的是:compile廷粒、test窘拯、provided三個。
運行時依賴范圍(runtime),使用該依賴范圍的maven依賴坝茎,只對測試和運行的classpath有效涤姊,對編譯的classpath無效,典型例子就是JDBC的驅(qū)動實現(xiàn)嗤放,項目主代碼編譯的時候只需要JDK提供的JDBC接口思喊,只有在測試和運行的時候才需要實現(xiàn)上述接口的具體JDBC驅(qū)動。
系統(tǒng)依賴范圍(system)次酌,系統(tǒng)依賴范圍必須通過配置systemPath元素來顯示指定依賴文件的路徑恨课,此類依賴不是由maven倉庫解析的,而且往往與本機系統(tǒng)綁定岳服,可能造成構(gòu)件的不可移植剂公,因此謹慎使用
從開發(fā)和運行這兩個不同階段理解compile和provided的區(qū)別
依賴的排除
為什么需要依賴的排除
repository模塊引入了一個依賴是dubbo,而dubbo又依賴了commons-logging吊宋,因為依賴的傳遞性將dubbo依賴的commons-logging引入repository模塊诬留,但是個別情況下commons-logging有可能是一個不穩(wěn)定版,或?qū)Ξ?dāng)前模塊有不良影響,這時我們可以在引入dubbo的時候?qū)ommons-logging排除
依賴的原則
service模塊引入了repository模塊文兑,因為依賴的傳遞性會講repository依賴的jar包導(dǎo)入到當(dāng)前模塊,但是service模塊引用的是最新版本的commons-logging腺劣,因為依賴的傳遞性绿贞,controller模塊就有兩個commons-logging版本,怎能解決呢橘原?
這種情況就需要依靠maven依賴的原則,來解決jar包的沖突
依賴的原則分兩種
? 1 路徑最短者優(yōu)先
? 2 路徑相同時先聲明者優(yōu)先
依賴的統(tǒng)一管理
一般同一個框架的jar包用的都是對應(yīng)相同的版本號籍铁,想要統(tǒng)一升級,怎么辦趾断?
這個時候就用到依賴的統(tǒng)一管理拒名,可以將jar包的版本信息統(tǒng)一抽取出來,以后框架升級只需修改抽取出來的版本信息即可
1 在< properties >標(biāo)簽內(nèi)使用自定義的標(biāo)簽統(tǒng)一聲明版本號
2 在需要用的同一版本的位置芋酌,使用${自定義標(biāo)簽}引用抽取出來的版本信息即可
繼承了解
如果項目中各個模塊各自使用的jar包版本不統(tǒng)一(如junit)增显,無法統(tǒng)一管理和統(tǒng)一升級,要統(tǒng)一版本或者統(tǒng)一升級的時候需要到每個模塊中手動修改是不可取的那么這個時候怎么辦脐帝?
由于非compile范圍的依賴不能傳遞同云,所以必然導(dǎo)致每個模塊需要引入自己的junit包,很容易造成版本不一樣
這個時候就需要我們繼承機制堵腹,使用繼承機制就可以將這種非compile范圍炸站,無法傳遞的jar包依賴信息提取到父工程模塊中進行統(tǒng)一管理。
實現(xiàn)繼承
聚合
工程拆分成多個模塊后疚顷,需要手動逐個按順序?qū)⒆幽K安裝到倉庫后才能繼續(xù)后續(xù)的操作旱易。修改代碼后也需要逐個手動進行clean操作。不僅麻煩腿堤,而且容易出錯阀坏,這個時候又怎么辦呢?
用maven的聚合就可以批量進行Maven工程的安裝释液、清理工作全释。
實現(xiàn)聚合
在“總的聚合工程”中配置各個需要參與聚合的模塊
配置子模塊的順序是可以錯亂,maven會自動找到依賴的關(guān)系误债,按先后關(guān)系進行安裝
多環(huán)境部署
在實際的項目開發(fā)中浸船,通常會有很多配置環(huán)境,比如最基本的:開發(fā)寝蹈、測試李命、生產(chǎn);不同的環(huán)境箫老,某些文件的配置是不一樣的(如:數(shù)據(jù)庫連接信息封字、properties文件的配置等),如果我們進行開發(fā)or測試時每次都得手動去修改配置文件,麻煩且容易出現(xiàn)問題阔籽,這個時候就需要maven的profile功能
maven的profile可以讓我們定義一系列的配置信息流妻,然后指定其激活條件。這樣我們就可以定義多個profile笆制,然后每個profile對應(yīng)不同的激活條件和配置信息绅这,從而達到不同環(huán)境使用不同配置信息的目的。
一般來講在辆,有三種地方可以定義证薇,不同的地方,作用范圍不同匆篓,可配置項也不同浑度;
1 針對于特定項目的profile配置,我們可以定義在該項目的pom.xml中鸦概。
2 針對于特定用戶的profile配置箩张,我們可以在用戶的settings.xml文件中定義profile。
3 該文件在用戶目錄下的“.m2”目錄下完残。全局的profile配置伏钠。
建立三種環(huán)境的資源文件夾
tips:maven標(biāo)準目錄中,提供了一個filters目錄用于存放資源過濾文件谨设。推薦在filters目錄下創(chuàng)建熟掂,而不是resources目錄,因為resources目錄中的文件默認情況下是不會被過濾的扎拣,還需在resources節(jié)點下額外的配置一些東西赴肚;這樣的話結(jié)構(gòu)也較清晰,resource目錄存放公共資源文件二蓝,filters目錄存放不同環(huán)境差異化資源文件誉券。
1 在pom.xml中的project節(jié)點下配置profile
2 在pom.xml中的build節(jié)點下配置maven-resources-plugin插件
在構(gòu)建WAR包的時候會經(jīng)過資源文件處理階段,maven-resources-plugin
則用來處理資源文件刊愚。
3 在pom.xml中的build節(jié)點下配置resources節(jié)點
4 測試踊跟,現(xiàn)在配置已經(jīng)完成了,然后我們執(zhí)行maven
update項目之后鸥诽,資源目錄會變化
接下來打包測試一下是否達到了我們的預(yù)期效果:mvn
clean package -P test
Maven快照
大型應(yīng)用軟件一般由多個模塊組成商玫,一般它是多個團隊開發(fā)對應(yīng)模塊,這是比較常見的場景牡借。
例如拳昌,一個團隊正在對應(yīng)用程序service模塊進行開發(fā),他們使用的是repository模塊钠龙。
現(xiàn)在炬藤,它可能會有這樣的情況發(fā)生御铃,負責(zé)repository模塊的團隊快速地bug修復(fù)或增強功能,他們每隔一天就要釋放出庫到遠程倉庫沈矿。
現(xiàn)在上真,如果repository團隊上傳新版本后,會出現(xiàn)下面的問題:
? 1 repository團隊?wèi)?yīng)該發(fā)布更新時每次都告訴應(yīng)用程序service團隊细睡,他們已經(jīng)發(fā)布更新了代碼谷羞。
? 2
service團隊需要經(jīng)常更新自己pom.xml以獲得更新應(yīng)用程序的版本。
為了處理這類情況溜徙,引入快照(SNAPSHOT)的概念
快照(SNAPSHOT?)是一個特殊版本,指出目前開發(fā)拷貝犀填。不同于常規(guī)版本蠢壹,Maven?每生成一個遠程存儲庫都會檢查新的快照版本。
在使用版本時九巡,如果 Maven
下載所提到的版本為repository
:1.0图贸,那么它永遠不會嘗試在庫中下載已經(jīng)更新的版本1.0。要下載更新的代碼冕广,repository的版本必須要升級到1.1疏日。
在使用快照(SNAPSHOT)時,Maven會在每次構(gòu)建項目時自動獲取最新的快照(
repository :1.0-SNAPSHOT)撒汉。
在使用快照(SNAPSHOT)時沟优,Maven
自動獲取最新的快照版本。
不過我們也可以強制使用 -U
切換到任何
maven
命令來下載最新的快照版本睬辐。
mvn clean package -U
專屬Repository
目前我們的項目都是直接使用Maven提供的Central
Repository挠阁,但是對于公司來說直接使用公共的Maven Central Repository就不見得是件好事。
此時你可以創(chuàng)建一個公司專屬的Repository(Internal
Repository)溯饵,公司的所有項目都只和這個專屬的Repository打交道侵俗,包括下載依賴,部署等丰刊。
1 代理外部Repository(比如Maven
Central Repository)隘谣。
2 通過代理,專屬Repository還可以起到緩存的作用啄巧,這樣公司的每個開發(fā)者只需要從局域網(wǎng)的專屬Repository下載依賴寻歧,而不用消耗對外網(wǎng)絡(luò)資源。
3 發(fā)布公司自己的項目棵帽,如果你開發(fā)的項目需要被公司的其他團隊使用熄求,而又不能發(fā)布到公司外部的Repository中,那么專屬Repository是最好的選擇逗概。
4 發(fā)布一些購買的第三方軟件產(chǎn)品以供公司所有人使用弟晚,比如Oracle的數(shù)據(jù)庫Driver。
存在多種專屬Repository,比如Nexus和Artifactory等卿城,你甚至可以用一個FTP服務(wù)器做一個專屬Repository
Nexus搭建
要求:centos7枚钓,jdk8
1 下載最新版 Nexus并解壓,下載地址:https://www.sonatype.com/download-oss-sonatype,這里現(xiàn)在linux版本
wget https://sonatype-download.global.ssl.fastly.net/nexus/3/nexus-3.9.0-01-unix.tar.gz
tar -xvf nexus-3.9.0-01-unix.tar.gz
2 創(chuàng)建nexus用戶瑟押,不用從root用戶啟動
//創(chuàng)建nexus用戶
//目錄組和用戶都是nexus
// nexus3文件設(shè)置777
//編寫配置文件
# useradd nexus
# chown -R nexus..nexus
nexus3
# chmod 777 -R nexus3
3 修改配置
設(shè)置訪問端口
設(shè)置用戶
4 啟動nexus搀捷,進入nexus服務(wù)目錄下的bin,然后執(zhí)行./nexus
start或者./nexus
run
./nexus start //后臺啟動多望,不顯示日志
./nexus run ?//后臺啟動嫩舟,顯示日志
5 瀏覽器輸入http://192.168.1.150:8800即可訪問nexus
默認用戶名admin,默認密碼admin123
Nexus介紹
Group:倉庫組
Hosted:宿主倉庫,發(fā)布內(nèi)部項目構(gòu)件和第三方項目構(gòu)件(oracle驅(qū)動JDBC驅(qū)動)
Proxy:代理倉庫
maven-public:倉庫分組怀偷,把上面三個倉庫組合在一起對外提供服務(wù)家厌,在本地maven基礎(chǔ)配置settings.xml中使用。
maven-central:maven中央庫椎工,默認從https://repo1.maven.org/maven2/拉取jar
maven-releases:私庫發(fā)行版jar
maven-snapshots:私庫快照(調(diào)試版本)jar
Nexus使用
配置私服饭于,修改settings.xml
a < server ></server >
b < mirror></mirror>
c < profile></profile>
d <activeProfile></activeProfile>
上傳到私服,修改工程配置pox.xml
< distributionManagement></distributionManagement>
也可直接通過nexus上傳