Maven學(xué)習(xí)總結(jié)
點(diǎn)擊上方藍(lán)色字體,選擇“標(biāo)星公眾號(hào)”
優(yōu)質(zhì)文章,第一時(shí)間送達(dá)
? 作者?|??又要起名字呀?
來源 | urlify.cn/Vfm2mi
66套java從入門到精通實(shí)戰(zhàn)課程分享
一、Maven概念
一個(gè)?基于Java平臺(tái)?的?自動(dòng)化構(gòu)建工具?,幫助我們管理jar包和拆分項(xiàng)目,其他類似的構(gòu)建工具有 make-ant-maven-gradle。
基于Java平臺(tái):安裝maven前一定要配置好JDK環(huán)境。
自動(dòng)化構(gòu)建工具:eclipse就是自動(dòng)化構(gòu)建工具,幫助我們把java編譯為class文件。
二、Maven安裝
(1)下載JDK并配置環(huán)境變量。
(2)下載maven(http://maven.apache.org/download.cgi)。
(3)解壓安裝包,并配置maven環(huán)境變量。
a、配置MAVEN_HOME : D:\apache-maven-3.6.3\bin
b、配置path:%MAVEN_HOME%\bin
命令行窗口下用?mvn -v?驗(yàn)證安裝是否成功。
以上三步就已經(jīng)成功安裝了maven,但為了讓你的maven使用經(jīng)歷更加暢快,你還需要做出以下一些小修改。
(1)增加Maven鏡像
Maven 倉庫默認(rèn)在國外, 國內(nèi)使用難免很慢,我們可以更換為阿里云的倉庫。
Maven安裝目錄下,找 conf ----->settings.xml,在?mirrors?標(biāo)簽下加入下面內(nèi)容
?????????
?????????<id>nexus-aliyunid>
?????????<mirrorOf>*mirrorOf>
?????????<name>Nexus aliyunname>
?????????<url>http://maven.aliyun.com/nexus/content/groups/publicurl>
mirror>(2)修改本地倉庫位置
Maven默認(rèn)本地倉庫地址在C盤,隨著項(xiàng)目的增加,這無疑會(huì)使得C盤變的臃腫,可以修改C盤的路徑。
Maven安裝目錄下,找 conf ----->settings.xml,修改?localRepository?標(biāo)簽中的地址到你開心的位置。
<localRepository>F:/soft/MVN_repositorylocalRepository>(3)修改IDE的配置,使本地倉庫生效
Eclipse:Windows---->Preferences---->Maven---->User Settings---->Global Settings選擇你之前配置的settings.xml
Idea:File---->Settings---->Maven---->User settings file選擇你之前配置的settings.xml
三、Maven常用命令
安裝完成后,不要先著急使用,還有一些知識(shí)需要你進(jìn)行了解,以便于你更好的使用Maven。
Maven生命周期總的來分為clean,build,site三大部分,其中build又依次包括validate--->compile--->Test--->package--->verify--->install--->deploy,本篇文章比較偏向于實(shí)踐,具體的生命周期的知識(shí)筆者不再贅述(生命周期的知識(shí)比較偏理論,但也挺重要的,還是希望大家自行了解下,https://www.runoob.com/maven/maven-build-life-cycle.html),生命周期的一些階段對(duì)應(yīng)著Maven的一些常用命令,
| 命令 | 描述 |
|---|---|
| mvn clean | 刪除target目錄(刪除編譯文件的目錄) |
| mvn compile | 只編譯main目錄中的java文件 |
| mvn test | 執(zhí)行test目錄下的測(cè)試用例 |
| mvn package | 將編譯后的代碼打包成可分發(fā)格式的文件,比如JAR、WAR或者EAR文件。 |
| mvn install | 安裝項(xiàng)目包到本地倉庫,這樣項(xiàng)目包可以用作其他本地項(xiàng)目的依賴 |
值得注意的是,每一個(gè)命令執(zhí)行時(shí),該命令之前以及包括該命令在內(nèi)的所有命令都會(huì)被執(zhí)行,比如執(zhí)行了mvn install,前邊的五條命令也都會(huì)被執(zhí)行。
四、POM文件
為了方便理解,先對(duì)常見的pom文件結(jié)構(gòu)進(jìn)行講解,掌握了下邊的文件結(jié)構(gòu),基本上你就可以關(guān)掉本篇博文,使用maven進(jìn)行開發(fā)了,但如果你對(duì)此并不滿足,可以繼續(xù)向下看。
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
?????
?????<modelVersion>4.0.0modelVersion>
?????
?????<groupId>com.liu.learninggroupId>
?????
?????<artifactId>HelloWorld01artifactId>
?????
?????<version>0.0.1-SNAPSHOTversion>
?????
?????<name>HelloWorld01name>
?????
?????<packaging>jarpackaging>
?????
?????<description>hello worlddescription>
?
?????
?????<profiles>
?????????<profile>
?????????????<id>jdk-1.8id>
?????????????<activation>
?????????????????<activeByDefault>trueactiveByDefault>
?????????????????<jdk>1.8jdk>
?????????????activation>
?????????????<properties>
?????????????????<maven.compiler.source>1.8maven.compiler.source>
?????????????????<maven.compiler.target>1.8maven.compiler.target>
?????????????????<maven.compiler.compilerVersion>1.8maven.compiler.compilerVersion>
?????????????properties>
?????????profile>
?????profiles>
?
?????<dependencies>
?????????
?????????<dependency>
?????????????<groupId>junitgroupId>
?????????????<artifactId>junitartifactId>
?????????????<version>4.12version>
?????????????
?????????????<scope>testscope>
?????????dependency>
?????dependencies>
?project>五、jar包的作用范圍scope
常用的三個(gè)分別是compile,test,provided 作用范圍如下表:
| 階段 \ scope | compile | test | provided |
|---|---|---|---|
| 編譯 | √ | × | √ |
| 測(cè)試 | √ | √ | √ |
| 部署(運(yùn)行) | √ | × | × |
1、compile
缺省值,如果不顯式聲明默認(rèn)為compile,適用于所有階段,會(huì)隨著項(xiàng)目一起發(fā)布。
2、test
jar包只在測(cè)試階段需要,常見的jar比如說junit
3、provided
jar包只在編譯和測(cè)試時(shí)需要,這種比較少見,比如說servlet-api.jar,編譯和測(cè)試時(shí)需要servlet 環(huán)境,但運(yùn)行時(shí)由tomcat提供servlet環(huán)境,就不需要servlet-api.jar了
六、Maven依賴與依賴排除
1、Maven自動(dòng)引入依賴
假如說我們需要用到A.jar,但是A.jar中又用到了B.jar,Maven會(huì)自動(dòng)幫我們引入B.jar,最常見的例子就是spring-context.jar 了,大家可以自行嘗試將下邊依賴引入,Maven不僅會(huì)將spring-context.jar引入,還會(huì)將spring-aop.jar,spring-beans.jar等其他jar包一并引入。
<dependency>
?????????????<groupId>org.springframeworkgroupId>
?????????????<artifactId>spring-contextartifactId>
?????????????<version>5.2.6.RELEASEversion>
?dependency>?2、依賴排除的兩種方案
但如果我們確實(shí)用不到其他jar但Maven又幫我們引入了,那該怎們辦呢?
?<dependency>
?????????????<groupId>org.springframeworkgroupId>
?????????????<artifactId>spring-contextartifactId>
?????????????<version>5.2.6.RELEASEversion>
?????????????<exclusions>
?????????????????<exclusion>
?????????????????????<groupId>org.springframeworkgroupId>
?????????????????????<artifactId>spring-coreartifactId>
?????????????????exclusion>
?????????????????<exclusion>
?????????????????????<groupId>org.springframeworkgroupId>
?????????????????????<artifactId>spring-beansartifactId>
?????????????????exclusion>
?????????????????<exclusion>
?????????????????????<groupId>org.springframeworkgroupId>
?????????????????????<artifactId>spring-aopartifactId>
?????????????????exclusion>
?????????????exclusions>
?dependency>
?
?
?
?<dependency>
?????????????<groupId>org.springframeworkgroupId>
?????????????<artifactId>spring-contextartifactId>
?????????????<version>5.2.6.RELEASEversion>
?????????????<exclusions>
?????????????????<exclusion>
?????????????????????<groupId>*groupId>
?????????????????????<artifactId>*artifactId>
?????????????????exclusion>
?????????????exclusions>
?dependency>七、Maven依賴傳遞與依賴原則
1、依賴傳遞
在數(shù)學(xué)上,若A依賴于B,B依賴于C,那么A依賴于C成立,但在Maven中還需要添加一個(gè)條件,要使 A.jar依賴于C.jar,當(dāng)且僅當(dāng) B.jar 依賴于C.jar的范圍是compile。
創(chuàng)建maven項(xiàng)目A,B,其中B中引入junit.jar,然后將B用mvn install安裝到本地倉庫,再將B引入到A,改變junit的scope觀察A中是否引入junit。
實(shí)驗(yàn)過程如上,讀者可自行實(shí)驗(yàn)。
2、依賴原則
我們?cè)賮砜聪逻吶齻€(gè)案例,
(1)同一POM中引入同一jar包的不同版本時(shí)(不推薦這樣做),會(huì)使用哪個(gè)版本呢?
(2)項(xiàng)目A->B,B->junit.jar(scope為compile),同時(shí)A->junit.jar,那么A中又會(huì)使用哪個(gè)jar呢?
(3)項(xiàng)目A依賴B和C,B和C都依賴了不同版本的junit.jar(scope為compile),那么A中會(huì)使用哪個(gè)jar呢?
前兩個(gè)很好猜,第一個(gè)pom文件寫在后邊的jar會(huì)覆蓋前邊的jar。第二個(gè)會(huì)選擇離自己最近的jar,也就是A中自己的jar。第三個(gè)同時(shí)也遵循 離自己最近的原則,但是兩者距離一樣,那怎么辦呢?POM文件中對(duì)B和C的依賴聲明總有先后順序吧,那就采用先聲明那個(gè)中的jar。
我們拋去第一個(gè)案例(開發(fā)中嚴(yán)禁這樣做),來總結(jié)下規(guī)則:
(1)路徑最近者優(yōu)先。
(2)第一聲明者優(yōu)先。
八、Maven依賴?yán)^承
1、父項(xiàng)目
?<packaging>pompackaging>
?
?<dependencyManagement>
?????????<dependencies>
?????????????<dependency>
?????????????????<groupId>junitgroupId>
?????????????????<artifactId>junitartifactId>
?????????????????<version>4.12version>
?????????????????<scope>compilescope>
?????????????dependency>
?????????dependencies>
?dependencyManagement>2、子項(xiàng)目
?<parent>
?????????<groupId>com.liu.learinggroupId>
?????????<artifactId>parentartifactId>
?????????<version>0.0.1-SNAPSHOTversion>
??????????
?????????
?????????<relativePath>../parent/pom.xmlrelativePath>
?parent>
?
?
?<dependencies>
?????????<dependency>
?????????????<groupId>junitgroupId>
?????????????<artifactId>junitartifactId>
?????????dependency>
?dependencies>九、項(xiàng)目聚合
Maven項(xiàng)目能夠識(shí)別自身和本地倉庫中的項(xiàng)目,如果項(xiàng)目A依賴項(xiàng)目B,必須要把項(xiàng)目B進(jìn)行打包安裝放入本地倉庫,然后再在項(xiàng)目A中引入才能使用。但是如果項(xiàng)目A依賴很多個(gè)其他項(xiàng)目,這樣一一打包安裝就比較麻煩了,這就引出了“聚合”。
?<packaging>pompackaging>
?
??
?<modules>
?????????<module>../onemodule>
?????????<module>../twomodule>
?modules>
?十、統(tǒng)一管理版本
有時(shí)候開發(fā)項(xiàng)目過程會(huì)遇到版本號(hào)統(tǒng)一升級(jí)的問題,例如junit版本從3.0版本升級(jí)成4.12版?這個(gè)時(shí)候有兩個(gè)處理辦法
1、原始方案
在pom文件里統(tǒng)一 ctrl+f 搜索替換一下。
2、高級(jí)方案
使用pom里的properties標(biāo)簽,自定義一個(gè)?xxx?標(biāo)簽,標(biāo)簽內(nèi)就是版本號(hào),在需要使用的地方使用?${xxx}?靈活取出上面定義的值,這個(gè)樣子就不用那樣修改多個(gè)地方啦!
<properties>
?????????<junit>4.12junit>
??properties>
?
?????<dependencies>
?????????<dependency>
?????????????<groupId>junitgroupId>
?????????????<artifactId>junitartifactId>
?????????????<version>${junit}version>
?????????????<scope>compilescope>
?????????dependency>
?????dependencies>

??? ?
感謝點(diǎn)贊支持下哈?
