一、什麼是Maven?
官網描述:
Apache Maven is a software project management and comprehension tool. Based on the concept of a project object model (POM), Maven can manage a project’s build, reporting and documentation from a central piece of information.
Maven 是一個軟件(特別是Java軟件)項目管理及自動構建工具,由Apache軟件基金會所提供。基於項目對象模型(縮寫:POM) 概念,Maven利用一箇中央信息片斷能管理一個項目的構建、報告和文檔等步驟。
二、特點
1.基於項目對象模型的思想
maven將項目看做一個對象,將項目的相關信息封裝爲對象,便於操作和管理。
maven項目對象的部分基礎屬性:
① 項目座標
項目座標用來定位一個項目在倉庫中的位置。包含groupId, artifactId, version。一個Maven座標是一個地址。當一個項目通過依賴,插件或者父項目引用和另外一個項目關聯的時候,Maven通過座標來精確定位一個項目。
② 打包方式。
這個屬性決定我們執行maven的package方法後,項目會被打包成什麼文件。
③ 其他屬性
如編碼方式等。
④ 項目依賴列表。
這個屬性的值是一個數組,裏邊有一些其他項目的座標。
⑤ 構建插件列表。
這個屬性是一個數組,定義項目需要的一些插件,比如源碼打包工具、web容器。
maven項目對象的部分方法:
①mvn compile 編譯項目
②mvn package 打包項目
③mvn clean 清除之前編譯和打包產生的文件
④mvn install 將項目安裝到本地倉庫
⑤mvn test 運行測試代碼
三、作用
1. 項目管理
- 項目信息管理
- 統一開發規範與工具
- 統一jar包管理
2. 自動構建
構建:從源碼到成品(通常是jar包或war包的形式)的過程。
構建環節:
環節 | 功能 |
---|---|
清理 | 將以前編譯得到的class字節碼文件刪除,爲下一次編譯做準備 |
編譯 | 將java源程序編程成class字節碼文件 |
測試 | 自動測試,自動調用Junit程序 |
報告 | 測試程序執行的結果 |
打包 | 動態web工程打包war包,java工程打jar包 |
安裝 | 將打包得到的文件複製到"倉庫"中的指定位置 |
部署 | 將動態web工程生成的war包複製到servlet容器的指定目錄下,使其可以運行 |
這些環節,maven都可以一個命令完成,即自動構建。
四、使用
1.下載
官網下載地址:http://maven.apache.org/download.cgi
選擇 Binary zip 類型的版本
下載完成後,解壓。
2. 配置maven環境變量
在環境變量–>系統變量–>path中,加入maven安裝目錄下的bin目錄路徑。
測試安裝成功:cmd中執行mvn -v
出現maven版本信息,即爲安裝成功。
3. 修改配置文件
maven 以倉庫的形式管理jar包,倉庫分爲中央倉庫(瀏覽器可訪問https://mvnrepository.com/),和本地倉庫。
本地倉庫方便離線使用,從中央倉庫下載的jar包都會放到本地倉庫。
maven默認本地倉庫目錄放在c盤,爲了方便查看以及減少C盤負荷,我們需更改本地倉庫位置:
- 一般在maven安裝目錄旁邊創建一個local文件夾
- 修改maven/conf/setting.xml配置文件,爲了避免出錯,修改前複製一個副本。
在 Setings 便籤裏面添加一條:
<localRepository>D:\E\Maven\local</localRepository>
在原文件中的 53 行有localRepository配置,但被註釋掉了,我們可以將其複製到註釋外面,然後修改其值。
- 修改鏡像
修改mirrors,在標籤下加入以下配置,啓動阿里雲的鏡像
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
4. 簡單運行
mvn archetype:generate -DarchetypeCatalog=internal -DgroupId=com.chinasofti.build -DartifactId=demo
創建一個maven項目,項目groupId 爲com.chinasofti.build,artifactId爲 demo。
mvn clean compile exec:java -Dexec.mainClass=“com.chinasofti.build.App”
編譯項目(在編譯前,需先清理項目)
最後的項目結構:
src 下放的是源碼
target 下放的是編譯文件
五. 完整項目目錄結構
①
②、爲什麼 maven 工程的目錄結構要這樣呢?
1、Maven 要負責項目的自動化構建,以編譯爲例,Maven 要想自動進行編譯,那麼它必須知道 Java 的源文件保存在哪裏,這樣約定之後,不用我們手動指定位置,Maven 能知道位置,從而幫我們完成自動編譯。
2、遵循 約定>>>配置>>>編碼。即能進行配置的不要去編碼指定,能事先約定規則的不要去進行配置。這樣既減輕了勞動力,也能防止出錯。
③、pom.xml 文件
Project Object Model 項目對象模型,Maven 的核心配置文件,pom.xml,與構建過程相關的一切設置都在這個文件中進行配置。
六、構建的生命週期
1. 概念?
maven對構建(build)的過程進行了抽象和定義,這個過程被稱爲構建的生命週期(lifecycle)。
生命週期(lifecycle)由多個階段(phase)組成,每個階段(phase)會掛接一到多個goal。
goal是maven裏定義任務的最小單元,相當於ant裏的target。 可以理解maven爲一個插件的容器,每個插件綁定到某個goal執行。
2.生命週期內容
七、座標與依賴
1.座標詳解
<dependency>
<groupId>net.sf.json-lib</groupId>
<artifactId>json-lib</artifactId>
<version>2.4</version>
<type>jar</type>
<classifier>jdk15</classifier>
</dependency>
標籤 | 解釋 |
---|---|
dependency | 表示要使用一個依賴 |
groupId | 指定依賴的組織名 |
artifactId | 指定依賴的項目名 |
version | 指定依賴的版本名 |
type | 指定依賴的類型 |
classifier | 指定jdk版本 |
2. 依賴範圍
- compile:編譯時依賴在所有階段都可獲得,這是默認值。
- provided:提供的依賴範圍用來編譯應用程序,但無需部署。若你用到jdk或者應用服務器提供的JAR,則使用此範圍,servlet APIs就屬於這個依賴範圍。測試時,此依賴範圍也加入到classpath。
- runtime:運行依賴範圍在編譯階段是不需要的,只有在運行時需要,比如JDBC驅動程序。
- test:測試範圍依賴,僅在編譯和運行單元測試時需要(比如Junit)。
- system 本地依賴,不建議使用。(nexus)
3.依賴傳遞
Only compile and runtime scopes are transitive
A->B->C
簡單傳遞依賴:A->C
A->B-C(0.1)
A->C(0.2)
最短路徑優先原則: A->C(0.2)
A->B->C(0.1)
A->E->C(0.2)
第一聲明優先原則:最終依賴C(0.1)
4.依賴歸類
<properties>
<spring.version>2.5</spring.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
</dependencies>
5.依賴排除
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>4.3.1.Final</version>
<exclusions>
<exclusion>
<artifactId>slf4j-api</artifactId>
<groupId>org.slf4j</groupId>
</exclusion>
</exclusions>
</dependency>