1 Maven的簡介
# 1 Maven的簡介
## 1.1 簡介
Maven【[ˈmevən]】這個詞可以翻譯為"專家","內行"。 作為Apache組織中的一個頗為成功的開源專案,Maven主要服務於基於java平臺的專案構建,依賴管理和專案資訊管理。
無論是小型的開源類庫專案,還是大型的企業級應用; 無論是傳統的瀑布式開發,還是流行的敏捷開發,Maven都能大顯身手。
## 1.2 專案構建
不管你是否意識到,構建(build)是每一位程式設計師每天都在做的工作。早上來到公司,我們做的第一件事就是從原始碼庫簽出最新的程式碼,然後進行單元測試,如果測試失敗,會找相關的同事一起除錯,修復錯誤程式碼。 接著回到自己的工作上來,編寫自己的單元測試及產品程式碼。
仔細總結一下,我們會發現,除了編寫原始碼,我們每天有相當一部分時間花在了編譯,執行單元測試,生成文件,打包和部署等繁瑣且不起眼的工作上,這就是構建。 如果我們現在還手工這樣做,那成本也太高了,於是有人用軟體的方法讓這一系列工作完全自動化,使得軟體的構建可以像全自動流水線一樣,只需要一條簡單的命令,所有繁瑣的步驟都能夠自動完成,很快就能得到最終結果。
## 1.3 專案構建工具
**Ant構建**
最早的構建工具,基於IDE, 大概是2000年有的,當時是最流行java構建工具,不過它的XML指令碼編寫格式讓XML檔案特別大。對工程構建過程中的過程控制特別好
**Maven【JAVA】**
專案物件模型,通過其描述資訊來管理專案的構建,報告和文件的軟體專案管理工具。它填補了Ant缺點,Maven第一次支援了從網路上下載的功能,仍然採用xml作為配置檔案格式。Maven專注的是依賴管理,使用Java編寫。
**Gradle**
屬於結合以上兩個的優點,它繼承了Ant的靈活和Maven的生命週期管理,它最後被google作為了Android御用管理工具。它最大的區別是不用XML作為配置檔案格式,採用了DSL格式,使得指令碼更加簡潔。
目前市面上Ant比較老,所以一般是一些比較傳統的軟體企業公司使用,Maven使用Java編寫, 是當下大多數網際網路公司會使用的一個構建工具, 中文文件也比較齊全, gradle是用groovy編寫,目前比較新型的構建工具一些初創網際網路公司會使用,以後會有很大的使用空間。
## 1.4 Maven的四大特性
### 1.4.1 依賴管理系統
Maven為Java世界引入了一個新的依賴管理系統jar包管理 jar 升級時修改配置檔案即可。在Java世界中,可以用groupId、artifactId、version組成的Coordination(座標)唯一標識一個依賴。
任何基於Maven構建的專案自身也必須定義這三項屬性,生成的包可以是Jar包,也可以是war包或者jar包。一個典型的依賴引用如下所示:
```xml
<dependency>
<groupId>javax.servlet</groupId> com.baidu
<artifactId>javax.servlet-api</artifactId> ueditor echarts
<version>3.1.0</version>
</dependency>
```
**座標屬性的理解**
Maven座標為各種元件引入了秩序,任何一個元件都必須明確定義自己的座標。
**groupId**
定義當前Maven專案隸屬的實際專案-公司名稱。(jar包所在倉庫路徑) 由於Maven中模組的概念,因此一個實際專案往往會被劃分為很多模組。 比如spring是一個實際專案,其對應的Maven模組會有很多,如spring-core,springwebmvc等。
**artifactId**
該元素定義實際專案中的一個Maven模組-專案名, 推薦的做法是使用實際專案名稱作為artifactId的字首。 比如:spring-bean、 spring-webmvc等。
**version**
該元素定義Maven專案當前所處的版本。
### 1.4.2 多模組構建
專案複查時 dao service controller 層分離將一個專案分解為多個模組已經是很通用的一種方式。
在Maven中需要定義一個parent POM作為一組module的聚合POM。在該POM中可以使用 <modules> 標籤來定義一組子模組。parent POM不會有什麼實際構建產出。而parent POM中的build配置以及依賴配置都會自動繼承給子module。
### 1.4.3 一致的專案結構
Ant時代大家建立Java專案目錄時比較隨意,然後通過Ant配置指定哪些屬於source,那些屬於testSource等。而Maven在設計之初的理念就是Conversion over configuration(約定大於配置)。其制定了一套專案目錄結構作為標準的Java專案結構,解決不同ide 帶來的檔案目錄不一致問題。
### 1.4.4 一致的構建模型和外掛機制
```xml
<plugin>
<groupId>org.mortbay.jetty</groupId>
<artifactId>maven-jetty-plugin</artifactId>
<version>6.1.25</version>
<configuration>
<scanIntervalSeconds>10</scanIntervalSeconds>
<contextPath>/test</contextPath>
</configuration>
</plugin>
```