爲了加快速度,在setting.xml中加一段配置,用國內阿里雲的鏡像倉庫能夠去下載各類東西。java
<mirror> <id>nexus-aliyun</id> <mirrorOf>*</mirrorOf> <name>Nexus aliyun</name> <url>http://maven.aliyun.com/nexus/content/groups/public</url> </mirror>
而後測試下,在終端輸入:apache
進入代碼保存的相關目錄緩存
cd /Users/wangmeng/Documents/space/learn
構建一個maven工程:架構
mvn archetype:generate -DgroupId=com.wangmeng.maven -DartifactId=maven-first-app -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
此時maven會在當前目錄下 新建一個目錄,名稱就是-DartifactId指定的名稱。這個這個目錄,就能夠看到maven自動給咱們初始化好了一個工程對應的目錄結構。app
這就是基本的maven工程目錄結構,其中src/main/java目錄包含了這個項目的java源碼,src/test/java目錄包含了測試代碼,pom.xml文件就是maven的核心配置文件maven
pom.xml文件是一個項目最核心的maven配置文件,包含了大量的信息,maven真是基於這裏的配置信息來對工程進行構建管理工做的。一個最基本的pom.xml文件如maven生成的pom.xml所示。ide
<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/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.zhss.maven</groupId> <artifactId>maven-first-app</artifactId> <packaging>jar</packaging> <version>1.0-SNAPSHOT</version> <name>maven-first-app</name> <url>http://maven.apache.org</url> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> </dependencies> </project>
咱們項目中的pom.xml是如何依賴以及構建的呢?測試
全局的maven配置,settings.xml
maven的約定:各類約定目錄,代碼/資源/輸出/測試網站
mvn構建命令:ui
maven的體系結構圖:
每一個maven項目都有一個座標
groupId+artifactId+version+packaging+classifier 五個維度的座標,惟必定義一個依賴包,任何一個項目,都是用這五個維度惟必定位一個發佈包。
例如:
groupId: com.wangmeng.oa
artifactId: oa-organ
version: 1.0.0-SNAPSHOT
<dependency> <groupId></groupId> <artifactId></artifactId> <version></version> <type></type> <scope></scope> <optional></optional> </dependency>
1,依賴範圍:
2,傳遞性依賴
maven的依賴性傳遞,就是說會自動遞歸解析全部的依賴,而後負責將依賴下載下來,全部層級的依賴都會成爲咱們項目的依賴。
好比說咱們依賴於A是compile範圍,A依賴於B,B是test範圍。那麼A只有在測試的時候纔會使用B。
傳遞性依賴機制對依賴範圍也是有影響的,好比下面的表格,第一列是一級依賴,第一行是二級依賴,傳遞性依賴會致使多級依賴的依賴範圍交叉在一塊兒,會有影響。
3,依賴調解
依賴傳遞性會致使依賴衝突的問題,例如
好比A->B->C->X(1.0),A->D->X(2.0),A有兩個傳遞性依賴X,不一樣的版本
此時就會依賴調解,就近原則,離A最近的選用,就是X的2.0版本
若是A->B->X(1.0)和A->D->X(2.0),路徑等長呢?那麼會選擇第一聲明原則,哪一個依賴在pom.xml裏先聲明,就用哪一個
4,可選依賴
<optional>true</optional>
此時以來傳遞失效,不會向上傳遞。
1,依賴衝突
由於maven的依賴具備傳遞性,因此就應運而生了依賴的衝突
好比咱們同時依賴A和B,此時A依賴了C-1.0, B依賴了D,D依賴了C-2.0
按照上面所說取最短路徑,因此咱們項目依賴C-1.0
若是C-1.0 有方法CClass.sayHello()
C-2.0中添加新方法CClass.printHello()
D調用C-2.0中的printHello()這個方法,這時由於項目中依賴的是C-1.0,因此使用時就會報錯
2,解決依賴衝突
mvn depedency:tree命令,查看項目中maven依賴關係樹,而後將有衝突的依賴找出來,在pom中使用exclusion處理。
A
--C-1.0
B
--D
--C-2.0
<dependency> <groupId>A</groupId> <artifactId>A</artifactId> <version>1.0</version> <exclusions> <exclusion> <groupId>C</groupId> <artifactId>C</artifactId> </exclusion> </exclusions> </dependency>
maven倉庫的大類分爲本地倉庫和遠程倉庫兩種,若是咱們聲明瞭一個依賴,那麼在構建打包的時候,先會去本地倉庫找,這個本地倉庫的地址默認就是~/.m2/repository目錄下面,固然settings.xml文件是能夠修改這個地址的。若是本地倉庫找不到,那麼就會去遠程倉庫找,默認是去maven本身的中央倉庫裏找,maven的中央倉庫幾乎涵蓋全部的依賴,而後會將中央倉庫的依賴下載下來放到本地倉庫,緩存起來,供下次使用。
感興趣的小夥伴可關注我的公衆號:壹枝花算不算浪漫