Maven做爲一個構建工具,不只能幫咱們自動化構建,還可以抽象構建過程,提供構建任務實現;它跨平臺,對外提供了一致的操做接口,這一切足以使它成爲優秀的、流行的構建工具。
Maven不只是構建工具,仍是一個依賴管理工具和項目管理工具,它提供了中央倉庫,能幫我自動下載構件。php
在安裝maven以前首先先肯定Windows上安裝了Jdk java
而後去Maven官網maven.apache.org/download.cg…下載.zip結尾的Maven文件,以下圖: spring
最後設置環境Maven的環境變量,主要配置M2_HOME和PATH兩項,步驟以下圖:sql
第一步和Windows同樣,下載Maven,格式爲tar.gz,解壓以後放到你想放到的位置 apache
而後打開終端輸入vim ~/.bash_profile
,在環境變量中添加一條export PATH="~/software/Maven/apache-maven-3.5.4/bin":$PATH
,後面是我本機根目錄的位置,添加以後:wq
保存退出,而後source ~/.bash_profile
使配置生效。vim
輸入mvn -version
查看是否安裝成功 api
該目錄包含了mvn運行的腳本,這些腳本用來配置java命令,準備好classpath和相關的Java系統屬性,而後執行Java命令。bash
該目錄只包含一個文件,該文件爲plexus-classworlds-2.5.2.jar。plexus-classworlds是一個類加載器框架,相對於默認的java類加載器,它提供了更加豐富的語法以方便配置,Maven使用該框架加載本身的類庫。app
該目錄包含了一個很是重要的文件settings.xml。直接修改該文件,就能在機器上全局地定製Maven的行爲,通常狀況下,咱們更偏向於複製該文件至/.m2/目錄下(表示用戶目錄),而後修改該文件,在用戶範圍定製Maven的行爲。框架
該目錄包含了全部Maven運行時須要的Java類庫,Maven自己是分模塊開發的,所以用戶能看到諸如maven-core-3.0.jar、maven-model-3.0.jar之類的文件,此外這裏還包含一些Maven用到的第三方依賴如commons-cli-1.2.jar、commons-lang-2.6.jar等等。
mvn dependency:tree,查看項目中jar包的依賴數,解決jar包衝突問題。
mvn clean:表示運行清理操做(會默認把target文件夾中的數據清理)。
mvn clean compile:表示先運行清理以後運行編譯,會將代碼編譯到target文件夾中。
mvn clean test:運行清理和測試。
mvn clean package:運行清理和打包。
mvn clean install:運行清理和安裝,會將打好的包安裝到本地倉庫中,以便其餘的項目能夠調用。
mvn clean deploy:運行清理和發佈(發佈到私服上面)。
說明:
Maven的級別有兩種,一是用戶級別,該級別是默認級別.第二種是全局的配置.通常不生效.可是要求兩種級別的配置文件必須相同,不然會有意想不到的異常.
<!-- Windows中的配置-->
<localRepository>E:/software/mvn_repo</localRepository>
<!-- Mac中的配置 -->
<!-- <localRepository>/Users/hxx/software/mvn_repo</localRepository> -->
複製代碼
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>*</mirrorOf>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
複製代碼
說明:Maven經過骨架建立項目時默認的JDK版本1.5,因此須要手動修改JDK,可是修改繁瑣,因此添加以下的配置
<!-- 全局jdk配置,settings.xml -->
<profile>
<id>jdk17</id>
<activation>
<activeByDefault>true</activeByDefault>
<jdk>1.7</jdk>
</activation>
<properties>
<maven.compiler.source>1.7</maven.compiler.source>
<maven.compiler.target>1.7</maven.compiler.target>
<maven.compiler.compilerVersion>1.7</maven.compiler.compilerVersion>
</properties>
</profile>
<!-- jdk1.8配置 <profile> <id>jdk18</id> <activation> <activeByDefault>true</activeByDefault> <jdk>1.8</jdk> </activation> <properties> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> <maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion> </properties> </profile> -->
複製代碼
博主如今想要在本身的開發工具中使用本身配置好的Maven,因此來介紹一下,一下是Eclipse和Idea中的Maven配置
<?xml version="1.0" encoding="UTF-8"?>
<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>
<groupId>com.hxxzt</groupId>
<artifactId>Maventest</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>Maventest</name>
</project>
複製代碼
這裏須要說明一下,這裏的groupId、artifactId、version都是本身定義的,與上面解釋的座標不同,座標是在Maven中央倉庫中的地址,這個定義的是你本身項目的座標,注意~
代碼的第一行是XML頭,指定了該xml文檔的版本和編碼方式。
project是全部pom.xml的根元素,它還聲明瞭一些POM相關的命名空間及xsd元素。
根元素下的第一個子元素modelVersion指定了當前的POM模型的版本,對於Maven3來講,它只能是4.0.0
代碼中最重要是包含了groupId,artifactId和version了。這三個元素定義了一個項目基本的座標,在Maven的世界,任何的jar、pom或者jar都是以基於這些基本的座標進行區分的。
groupId定義了項目屬於哪一個組,隨意命名,好比谷歌公司的myapp項目,就取名爲 com.google.myapp
artifactId定義了當前Maven項目在組中惟一的ID,好比定義hello-world。
version指定了項目當前的版本0.0.1-SNAPSHOT,SNAPSHOT意爲快照,說明該項目還處於開發中,是不穩定的。
name元素生命了一個對於用戶更爲友好的項目名稱,雖然這不是必須的,但仍是推薦爲每一個POM聲明name,以方便信息交流
關於座標(Coordinate),你們最熟悉的定義應該 來自於平面幾何。在一個平面座標系中,座標( x, y)表示該平面上與x軸距離爲y,與y軸距離爲x的一點,任何一個座標都可以惟一標識該平面中的一點。在實際生活中,咱們也能夠將地址當作是一種座標。省、市、區、街道等一系列信息一樣能夠惟一標識城市中的任一居住地址和工做地址。郵局和快遞公司正是基於這樣一種座標進行平常工做的。
Maven座標爲各類構件引入了秩序,任何一個構件都必須明肯定義本身的座標,而一組Maven座標是經過一些 元素定義的,它們是groupId、artifactId、version、packaging、classifier。
<project>
...
<dependencies>
<dependency>
<groupId>實際項目</groupId>
<artifactId>模塊</artifactId>
<version>版本</version>
<type>依賴類型</type>
<scope>依賴範圍</scope>
<optional>依賴是否可選</optional>
<!—主要用於排除傳遞性依賴-->
<exclusions>
<exclusion>
<groupId>…</groupId>
<artifactId>…</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependencies>
...
</project>
複製代碼
根元素project下的dependencies能夠包含一個或者多個dependency元素,以聲明一個或者多個項目依賴。每一個依賴能夠包含的元素有:
依賴範圍就是用來控制依賴和三種classpath(編譯classpath,測試classpath、運行classpath)的關係,Maven有以下幾種依賴範圍:
compile:編譯依賴範圍。若是沒有指定,就會默認使用該依賴範圍。使用此依賴範圍的Maven依賴,對於編譯、測試、運行三種classpath都有效。典型的例子是spring-code,在編譯、測試和運行的時候都須要使用該依賴。
test: 測試依賴範圍。使用次依賴範圍的Maven依賴,只對於測試classpath有效,在編譯主代碼或者運行項目的使用時將沒法使用此依賴。典型的例子是Jnuit,它只有在編譯測試代碼及運行測試的時候才須要。 provided:已提供依賴範圍。使用此依賴範圍的Maven依賴,對於編譯和測試classpath有效,但在運行時候無效。典型的例子是servlet-api,編譯和測試項目的時候須要該依賴,但在運行項目的時候,因爲容器以及提供,就不須要Maven重複地引入一遍。
runtime:運行時依賴範圍。使用此依賴範圍的Maven依賴,對於測試和運行classpath有效,但在編譯主代碼時無效。典型的例子是JDBC驅動實現,項目主代碼的編譯只須要JDK提供的JDBC接口,只有在執行測試或者運行項目的時候才須要實現上述接口的具體JDBC驅動。
system:系統依賴範圍。該依賴與三種classpath的關係,和provided依賴範圍徹底一致,可是,使用system範圍的依賴時必須經過systemPath元素顯示地指定依賴文件的路徑。因爲此類依賴不是經過Maven倉庫解析的,並且每每與本機系統綁定,可能構成構建的不可移植,所以應該謹慎使用。systemPath元素能夠引用環境變量,如:
<dependency>
<groupId>javax.sql</groupId>
<artifactId>jdbc-stdext</artifactId>
<Version>2.0</Version>
<scope>system</scope>
<systemPath>${java.home}/lib/rt.jar</systemPath>
</dependency>
複製代碼
後面有須要補充的繼續更新。本篇基於許曉兵《Maven實戰》提煉,亞馬遜購買本書請戳此處—->《Maven實戰》購買