Maven 簡介
Maven是什么?
Maven 這個詞可以翻譯為“知識的積累”,也可以翻譯為“專家”或“內涵”。本文將介紹maven這一跨平臺的項目管理使用工具。做為apache組織中一個頗為成功的開源項目,maven主要服務于基于java平臺的項目構建,依賴管理和項目信息管理,無論是小型的開源類庫項目,還是大型的企業級應用;無論是傳統的瀑布式開發,還是流行的敏捷模式,Maven都能大顯身手
-- maven實戰
何為構建
除了編寫源代碼,我們每天有相當一部分時間花在了編譯、運行單元測試、生成文檔、打包和部署等煩瑣且不起眼的工作上,這就是構建
如果我們現在還手工這樣做,那成本也太高了,于是有人用軟件的方法讓這一系列工作完全自動化,使得軟件的構建可以像全自動流水線一樣,只需要一條簡單的命令,所有煩瑣的步驟都能夠自動完成,很快就能得到最終結果
maven不僅僅是構建工具
依賴管理
與ant的區別
我看到很多項目的ant腳本中的命名基本上都是一致的,比如:編譯一般叫build或者compile;打包一般叫jar或war;生成文檔一般命名為 javadoc或javadocs;但其實最常用的就2,3個:比如javac javadoc jar等。
這是因為Ant所提供的可重用的****task****粒度太小,雖然靈活性很強,但是我們需要糾纏很多細節的東西
ANT是沒有依賴管理的,而對于Maven用戶來說,依賴管理是理所當然的,Maven不僅內置了依賴管理,更有一個可能擁有全世界最多Java開源軟件包的中央倉庫,Maven用戶無須進行任何配置就可以直接享用。
Maven的優點:
1.擁有約定,知道你的代碼在哪里,放到哪里去
2.擁有一個生命周期,例如執行 mvn install就可以自動執行編譯,測試,打包等構建過程
3.只需要定義一個pom.xml,然后把源碼放到默認的目錄,Maven幫你處理其他事情
4.擁有依賴管理,倉庫管理
Maven 的安裝配置
首先官網下載 http://maven.apache.org/download.cgi
說明需要JDK 1.7及以上,這里我們使用JDK1.8
這里我下載的是maven 3.3.9
1.將安裝文件解壓到指定的目錄中,如:
D:\maven\apache-maven-3.3.9
2.設置環境變量
將D:\maven\apache-maven-3.3.9\bin 設進環境變量中
打開cmd 執行
mvn -v
注意事項
設置MAVEN_OPTS環境變量,通常需要設置MAVEN_OPTS的值為-Xms128m-Xmx512m,因為Java默認的最大可用內存往往不能夠滿足Maven運行的需要,比如在項目較大時,使用Maven生成項目站點需要占用大量的內存,如果沒有該配置,則很容易得到java.lang.OutOfMemeoryError。因此,一開始就配置該變量是推薦的做法。
maven使用入門
一、編寫pom文件
就像Make的Makefile、Ant的build.xml一樣,Maven項目的核心是pom.xml。POM(Project Object Model,項目對象模型)定義了項目的基本信息,用于描述項目如何構建,聲明項目依賴,等等。現在先為Hello World項目編寫一個最簡單的pom.xml。
<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.pikaq</groupId>
<artifactId>maventest</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>maventest</name>
</project>
這段代碼中最重要的是包含groupId、artifactId和version的三行。這三個元素定義了一個項目基本的坐標,在Maven的世界,任何的jar、pom或者war都是以基于這些基本的坐標進行區分的。
groupId定義了項目屬于哪個組,這個組往往和項目所在的組織或公司存在關聯。譬如在googlecode上建立了一個名為myapp的項目,那么groupId就應該是com.googlecode.myapp,如果你的公司是mycom,有一個項目為myapp,那么groupId就應該是com.mycom.myapp。本書中所有的代碼都基于groupId com.juvenxu.mvnbook。
本書其他章節代碼會分配其他的artifactId。而在前面的groupId為com.googlecode.myapp的例子中,你可能會為不同的子項目(模塊)分配artifactId,如myapp-util、myapp-domain、myapp-web等
顧名思義,version指定了Hello World項目當前的版本——1.0-SNAPSHOT。SNAPSHOT意為快照,說明該項目還處于開發中,是不穩定的版本。隨著項目的發展,version會不斷更新,如升級為1.0、1.1-SNAPSHOT、1.1、2.0等。6.5節會詳細介紹SNAPSHOT,第13章會介紹如何使用Maven管理項目版本的升級發布。
最后一個name元素聲明了一個對于用戶更為友好的項目名稱,雖然這不是必須的,但還是推薦為每個POM聲明name,以方便信息交流。
編寫主代碼
package com.pikaq.maventest;
public class Helloworld{
public String sayHello(){
return "hello";
}
public static void main(String [] args){
System.out.println(new Helloworld().sayHello());
}
}
這里需要注意,在大多數情況下,我們應該遵循maven約定把代碼放在src/main/java 目錄下,無需其他配置,maven就會自動去搜尋主代碼,代碼編寫完之后,使用
mvn clean compile 編譯
編寫測試代碼
和編寫主代碼類似,測試代碼的目錄對應的應該在 src/test/java 下,因此應該先創建目錄,
修改項目 pom 文件,增加Junit依賴
<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.pikaq</groupId>
<artifactId>maventest</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>maventest</name>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.7</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
編寫測試類
package com.pikaq.maventest;
import static org.junit.Assert.assertEquals;
import org.junit.Test;
public class HelloworldTest{
@Test
public void testSayHello(){
Helloworld h = new Helloworld();
String result = h.sayHello();
assertEquals("hello",result);
}
}
運行 mvn clean test
打包和運行
mvn clean package
maven 在打包之前執行了編譯和測試操作
但是如何讓其他maven 項目引用這個jar包呢:
mvn clean install
通過執行install 命令將jar 安裝到了本地倉庫中
使用Archetype 生成項目骨架
前面我們只是為了我們進一步熟悉maven,真正用的時候我們當然不會這么復雜,一個一個目錄的去創建,這顯然是重復勞動!我們只需要一個簡單的命令就能生成我們約定好的項目骨架!
mvn archetype:generate
注意這里極有可能會卡主,因為這個命令會默認去遠程請求所有的骨架
所以我們這里可以選擇 >mvn archetype:generate -DarchetypeCatalog=internal
這個命令執行只會列出常用的10個
我們只需要按照提示選擇一個即可,并依次輸入groupID等
提示創建成功,我們發現已經生成了一個maven項目,是不是非常簡單!
maven 的依賴管理問題
maven會自動選擇路徑最短的