Maven入門
maven是一個java平台下的的軟件項目管理和綜合工具,由Apache組織中開發維護,基於項目對象模型的概念,maven可以根據一個中心信息來管理項目的構建,文檔和報告;
注意此處的項目管理不是某種工作崗位,而是描述程序員開發工作中的一部分;
為何需要maven
在日常開發工作中,開發者需要自行管理項目依賴,頻繁的編譯,清理,測試,打包,發布等等.....雖然IDE都提供了相應的支持,但也免不了我們需要,花很多時間進行這些重復且沒有技術含量的工作,我們將上述這些過程統稱為項目構建
Maven的出現正是為了將開發者從繁雜的項目構建中解放出來
Maven能做什么
-
Making the build process easy
使得構建項目過程變得更簡單,Maven不會消除對底層機制的了解,沒有太過高級的封裝,但可以讓你免受許多細節的影響
-
Providing a uniform build system
提供了統一的構建系統,Maven使用其項目對象模型(POM)和一組插件來構建項目,一旦熟悉了一個Maven項目,就知道所有Maven項目是如何構建的;
-
Providing quality project information
提供了項目質量信息,這些信息部分來自POM,部分來自項目源代碼,如:項目使用的依賴項,單元測試報告(包括覆蓋率),交叉引用等
-
Encouraging better development practices
鼓勵更好的開發實踐,Maven收集了當前的最佳開發實踐,並輕松地朝該方向指導項目。例如:單元測試的規范化,將測試的執行和報告作為Maven的常規構建周期的一部分,Maven還建議了一些有關項目目錄結構的准則,Maven還協助項目工作流程,例如發布和問題管理等
Maven相關概念
POM(項目對象模型)
- Maven整體采用的就是POM,既將項目看做一個對象,我們可以對這個項目對象進行相關屬性的設置,從而來完成項目的管理
- 一個POM可繼承其他POM從而使用其中已經定義好的內容;
- 可將一個Maven項目拆分為多個不同Maven模塊,只需要在POM中列出包含的模塊信息即可;
repository(倉庫)
所有Maven項目都具備自己的坐標,包括組織ID,坐標ID和版本號,有了坐標后,可將項目放入倉庫中,以供其他人使用,倉庫就是用來存放這些項目的地方,分為本地倉庫,和遠程倉庫,以及中央倉庫
中央倉庫也屬於遠程倉庫,是有maven官方維護的倉庫,是最完整的jar倉庫,為了區別於其他倉庫,所以稱之為中央倉庫
Dependency Management(依賴管理)
依賴指得是項目運行所必須的組件(可以是jar,java,class),依賴管理是Maven提供的最核心的功能之一,可根據提供的項目坐標,自動的從倉庫中下載需要的依賴,並且會幫助我們解決依賴沖突問題,
Project Lifecycle(項目生命周期)
項目生命周期指得是項目從創建工程開始到最終部署到服務器的所有動作(程序員要干的事情)的總稱,如編譯,測試,打包,部署,生成項目站點等....
Maven對這些動作進行了抽象,變成了一個個生命周期
生命周期
生命周期動作本質都是通過插件來完成的,所以Maven項目默認就存在與生命周期相關的幾個插件,具體如下:

三個生命周期:
-
默認(default)的生命周期,處理從驗證開始執行所有階段一直到部署
-
清潔(clean)生命周期,處理項目的清理操作
-
站點(site)生命周期,處理項目站點的創建和部署
階段
每個生命周期下包含若干個階段,以下列出重要階段(不區分周期)
階段 | 插件 | 作用 |
---|---|---|
clean | clean | 清理自動生成的文件,也就是 target 目錄 |
validate | 由 Maven 核心負責 | 驗證項目是否正確以及所有必要的信息均可用。 |
compile | compile | 編譯 Java 源碼 |
test | surefire | 運行測試代碼 |
package | war/jar/rar | 獲取編譯后的代碼,並將其打包為可分發格式如jar/war |
verify | 由 Maven 核心負責 | 驗證包是否有效並符合質量標准。 |
install | install | 將構件包安裝到本地倉庫 |
site | site | 生成項目站點,就是一堆靜態網頁文件,包括 JavaDoc |
deploy | deploy | 將構件包部署到遠程倉庫 |
安裝與配置
下載安裝
下載地址:https://maven.apache.org/download.cgi
正常使用下載binary二進制版本,需要查看源碼則下載源碼
下載后直接解壓即可,CMD中使用需設置環境變量,Maven不區分版本,bin下提供了用於unix的sh和用於windows的cmd文件,將bin添加至環境變量即可;
目錄:

添加環境變量后我們就可以,使用在命令行中使用mvn命令了,詳細命令見該文章,
另外:IDEA中已經集成了Maven,無需額外安裝,也不需要任何的命令
IDEA下配置Maven
在IDEA中我們可以自定義本地倉庫路徑和配置文件,在preferences中搜索Maven,可打開如下界面:
從上到下,分別是,Maven路徑,配置文件,倉庫路徑
- IDEA默認使用自己集成的Maven,若需要可以指定為自己安裝的其他maven
- IDEA會到~/.m下的查找settings.xml文件作為默認的Maven配置文件,但是該文件默認是沒有的,我們需要從自己下載的Maven目錄中復制一份到該目錄下
- 本地倉庫路徑通常不需要修改
開始使用
IDEA中Maven使用步驟簡述
- 創建Maven項目
- 指定倉庫地址,以及配置文件(僅第一次)
- 編輯pom.xml配置文件,(項目坐標,依賴,插件等...)
- 使用命令或插件來幫助完成要進行的構建工作
創建Maven普通項目

骨架即模板,主要是為了幫助我們創建可能用到的目錄結構
此處不選擇骨架
輸入項目名稱,組織表示符(公司域名倒序),以及工件ID:

創建成功后目錄結構如下:

第一次創建可能會耗時較長
查找需要的依賴
中央倉庫地址:https://mvnrepository.com,我們可以在上面查找需要的jar包

選擇版本

復制依賴

將復制的內容填寫到pom.xml中的dependencies下即可
鏡像倉庫
Maven默認訪問中央倉庫來獲取依賴,一些時候可能會很慢,我們可以在配置文件中添加鏡像服務器來解決這個問題
需要強調的是,鏡像倉庫的jar包通常沒有中央倉庫齊全
根據idea的maven配置找到settings.xml文件在mirrors標簽下添加內容
<mirror>
<id>alimaven</id>
<mirrorOf>central</mirrorOf>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
</mirror>
案例
依賴下載完成后我們就可以開始編寫代碼了
在src下編寫如下代碼:
public class MyClass {
public static void sayhello() {
System.out.println("hello maven");
}
public static void main(String[] args) {
sayhello();
}
}
編寫完成后我們通常會利用Junit進行測試
.1添加junit依賴
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13</version>
<scope>test</scope>
</dependency>
.2編寫測試代碼:
import org.junit.Test;
public class MyTest {
@Test
public void te1(){
System.out.println("111111111111111");
int i = 1/0;
}
}
.3在idea右側會有Maven的菜單,其中會顯示maven提供的各個插件,雙擊即可執行,測試我們執行test

常見錯誤
當我們在執行test以下的階段時maven會拋出以下異常:
不再支持源選項 5。請使用 6 或更高版本。
這是由於Maven默認編譯版本為1.5,目前已經不受支持,我們需要在pom添加以下內容,用於指定編譯版本和編碼方式:
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
以上方式只針對當前項目有效,當重新創建項目時又需要重新寫一次,針對該問題,可以通過在settings.xml添加通用配置來解決:
根據idea中的配置信息找到settings.xml文件,在profiles
標簽中添加以下內容:
<profile>
<id>jdk-1.8</id>
<activation> <!-- 配置激活條件 -->
<activeByDefault>true</activeByDefault> <!-- 是否是默認配置 -->
</activation>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
</profile>
當配置被激活時,將應用到項目中的且覆蓋pom中相同標簽;
配置完成重新執行test即可查看到測試輸出的信息:
其他常用操作

- 重新導入Maven項目,相當於刷新
- 更新所有Maven項目資源和文件夾
- 下載依賴和源碼
- 添加新的Maven項目
- 運行某個生命周期指令
- 運行自定義指令
- 顯示依賴關系圖
- 關閉已展開
Web項目
在創建項目是勾選create from archetype
,然后選擇webapp

該骨架沒有自動創建常用的文件夾,需要手動補全,如下:
]
另一種創建webapp方式
1.先創建一個普通的maven項目
2.pom中添加<packaging>war</packaging>
3.手動在main下創建webapp目錄
4.創建web.xml, 在工程名稱上點擊右鍵選擇Open Module Settings
,

在彈出的窗口中指定將web.xml創建到webapp目錄下:

運行WEB項目
Maven項目的運行與普通項目沒有太大的區別,不過我們還可以通過Maven插件來運行web項目,tomcat和一些常見服務器都有Maven插件
需要強調的是,Tomcat的Maven插件,最后一次更新是8.x版本,如果要使用最新的web服務器還是需要單獨下載
1.原始方式配置外部Tomcat
2.插件方式
2.1添加插件配置到pom.xml
<build>
<finalName>MavenP4</finalName>
<pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
<plugins>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<port>8888</port>
<path>/</path>
</configuration>
</plugin>
</plugins>
</pluginManagement>
</build>
2.2添加運行配置

上述操作等同於在控制台輸入指令mvn tomcat7:run
添加servlet依賴:
當需要使用servlet時,與非maven項目一樣需要添加servlet的依賴:
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
deploy
deploy是將打包的結果部署到指定服務器,因此需要指出服務器的地址,支持的上傳方式有SSH,FTP
FTP案例:
<distributionManagement>
<repository>
<id>ftp-repository</id>
<url>ftp://repository.mycompany.com/repository</url>
</repository>
</distributionManagement>
<build>
<extensions>
<!-- Enabling the use of FTP -->
<extension>
<groupId>org.apache.maven.wagon</groupId>
<artifactId>wagon-ftp</artifactId>
<version>1.0-beta-6</version>
</extension>
</extensions>
</build>
在settings.xml中找到servers
標簽添加ftp的用戶名和密碼:
<server>
<id>ftp-repository</id>
<username>root</username>
<password>admin</password>
</server>
另外maven也支持部署到私有maven倉庫,在一些公司可能會自己搭建maven私有倉庫