Maven的安裝、配置及使用入門



第1章 Maven的安裝和配置

1.1檢查JDK安裝

   在安裝Maven之前,首先確認是否已經正確安裝了JDK。Maven可以運行在JDK1.4及以上的版本上。打開Windows的命令行,運行如下命令來檢查Java安裝,如圖2-1所示:

   

   上述命令首先檢查環境變量JAVA_HOME是否指向了正確的JDK目錄,接着嘗試運行java命令。如果Windows無法執行java命令,或者無法找到JAVA_HOME環境變量。你就需要檢查Java是否安裝了,或者環境變量是否設置正確。
   

1.2下載Maven

   訪問Maven的下載頁面:http://maven.apache.org/download.html,其中包含針對不同平臺的各種版本的Maven下載文件。由於最新版本不太穩定,推薦使用Maven3.1.1,因此下載apache-maven-3.1.1-bin.zip。當然,如果你對Maven的源代碼感興趣並想自己構建Maven,還可以下載apache-maven-3.1.1-src.zip。該下載頁面還提供了md5校驗和(checksum)文件和asc數字簽名文件,可以用來檢驗Maven分發包的正確性和安全性。

   
   
   
1.3本地安裝

   將安裝文件解壓到你指定的目錄中,如:

   D:\ProgramFiles(x86)>jar xvf "D:\Downloads\apache-maven-3.1.1-bin.zip"

   
   這裏的Maven安裝目錄是D:\ProgramFiles(x86)\apache-maven-3.1.1,接着需要設置環境變量,將Maven安裝配置到操作系統環境中。
打開系統屬性面板(桌面上右鍵單擊"我的電腦"→"屬性"),點擊高級系統設置,再點擊環境變量,在系統變量中新建一個變量,變量名爲M2_HOME,變量值   爲Maven的安裝   目錄D:\ProgramFiles(x86)\apache-maven-3.1.1。點擊確定,接着在系統變量中找到一個名爲Path的變量,在變量值的末尾加       上%M2_HOME%\bin;,注意多個值之間需要有    分號隔開,然後點擊確定。至此,環境變量設置完成,詳細情況如圖2-2所示:
      


        這裏需要提一下的是Path環境變量,當我們在cmd中輸入命令時,Windows首先會在當前目錄中尋找可執行文件或腳本,如果沒有找到,Windows會接着遍歷環境變量Path中定義的路徑。由於我們將%M2_HOME%\bin添加到了Path中,而這裏%M2_HOME%實際上是引用了我們前面定義的另一個變量,其值是Maven的安裝目錄。因此,Windows會在執行命令時搜索目錄D:\ProgramFiles(x86)\apache-maven-3.1.1\bin,而mvn執行腳本的位置就是這裏。

   明白了環境變量的作用,現在打開一個新的cmd窗口(這裏強調新的窗口是因爲新的環境變量配置需要新的cmd窗口才能生效),運行如下命令檢查Maven的安裝情況:


1.4 安裝m2eclipse 

m2eclipse是Eclipse下的一款十分強大的Maven插件,可以訪問http://m2eclipse.sonatype.org/ 瞭解更多信息,下面介紹如何安裝m2eclipse插件。
啓動Eclipse之後,在菜單欄中選擇Help,然後選擇Install New Software…,接着你會看到一個Install對話框,點擊Work with:字段邊上的Add按鈕,你會得到一個新的Add Repository對話框,在Name字段中輸入m2e,Location字段中輸入http://download.eclipse.org/technology/m2e/releases,然後點擊OK。Eclipse會下載m2eclipse安裝站點上的資源信息。等待資源載入完成之後,我們再將其全部展開,就能看到圖2-6所示的界面:


如圖顯示了m2eclipse的核心模塊Maven Integration for Eclipse (Required),選擇後點擊Next >,Eclipse會自動計算模塊間依賴,然後給出一個將被安裝的模塊列表,確認無誤後,繼續點擊Next >,這時我們會看到許可證信息,m2eclipse使用的開源許可證是Eclipse Public License v1.0,選擇I accept the terms of the license agreements,然後點擊Finish,接着就耐心等待Eclipse下載安裝這些模塊,如圖2-7所示:


待安裝完畢後,重啓Eclipse,現在驗證一下m2eclipse是否正確安裝了。首先,點擊菜單欄中的Help,然後選擇About Eclipse,在彈出的對話框中,點擊Installation Details按鈕,會得到一個對話框,在Installed Software標籤欄中,檢查剛纔我們選擇的模塊是否在這個列表中,如圖2-9所示:


如果一切沒問題,再檢查一下Eclipse現在是否已經支持創建Maven項目,依次點擊菜單欄中的File→New→Other,在彈出的對話框中,找到Maven一項,再將其展開,看到如圖2-10所示的對話框:

如果一切正常,說明m2eclipse已經正確安裝了。

最後,關於m2eclipse的安裝,需要提醒的一點是,可能會在使用m2eclipse時遇到類似這樣的錯誤:
Eclipse is running in a JRE, but a JDK is required
Some Maven plugins may not work when importing projects or updating source folders.


這是因爲Eclipse默認是運行在JRE上的,而m2eclipse的一些功能要求使用JDK,解決方法是配置Eclipse安裝目錄的eclipse.ini文件,添加vm配置指向JDK,如:
--launcher.XXMaxPermSize
256m
-vm
D:\java\jdk1.6.0_07\bin\javaw.exe
-vmargs
-Dosgi.requiredJavaVersion=1.5
-Xms128m
-Xmx256m


第2章 Maven安裝最佳實踐

本節介紹一些在安裝Maven過程中不是必須的,但十分有用的實踐。

2.1 設置MAVEN_OPTS環境變量
前面介紹Maven安裝目錄時我們瞭解到,運行mvn命令實際上是執行了Java命令,既然是運行Java,那麼運行Java命令可用的參數當然也應該在運行mvn命令時可用。這個時候,MAVEN_OPTS環境變量就能派上用場。

我們通常需要設置MAVEN_OPTS的值爲:-Xms128m -Xmx512m,因爲Java默認的最大可用內存往往不能夠滿足Maven運行的需要,比如在項目較大時,使用Maven生成項目站點需要佔用大量的內存,如果沒有該配置,我們很容易得到java.lang.OutOfMemeoryError。因此,一開始就配置該變量是推薦的做法。

關於如何設置環境變量,請參考前面設置M2_HOME環境變量的做法,儘量不要直接修改mvn.bat或者mvn這兩個Maven執行腳本文件。因爲如果修改了腳本文件,升級Maven時你就不得不再次修改,一來麻煩,二來容易忘記。同理,我們應該儘可能地不去修改任何Maven安裝目錄下的文件。

2.2 配置用戶範圍settings.xml
Maven用戶可以選擇配置$M2_HOME/conf/settings.xml或者~/.m2/settings.xml。前者是全局範圍的,整臺機器上的所有用戶都會直接受到該配置的影響,而後者是用戶範圍的,只有當前用戶纔會受到該配置的影響。

我們推薦使用用戶範圍的settings.xml,主要原因是爲了避免無意識地影響到系統中的其他用戶。當然,如果你有切實的需求,需要統一系統中所有用戶的settings.xml配置,當然應該使用全局範圍的settings.xml。

除了影響範圍這一因素,配置用戶範圍settings.xml文件還便於Maven升級。直接修改conf目錄下的settings.xml會導致Maven升級不便,每次升級到新版本的Maven,都需要複製settings.xml文件,如果使用~/.m2目錄下的settings.xml,就不會影響到Maven安裝文件,升級時就不需要觸動settings.xml文件。

2.3 不要使用IDE內嵌的Maven
無論是Eclipse還是NetBeans,當我們集成Maven時,都會安裝上一個內嵌的Maven,這個內嵌的Maven通常會比較新,但不一定很穩定,而且往往也會和我們在命令行使用的Maven不是同一個版本。這裏有會出現兩個潛在的問題:首先,較新版本的Maven存在很多不穩定因素,容易造成一些難以理解的問題;其次,除了IDE,我們也經常還會使用命令行的Maven,如果版本不一致,容易造成構建行爲的不一致,這是我們所不希望看到的。因此,我們應該在IDE中配置Maven插件時使用與命令行一致的Maven。

在m2eclipse環境中,點擊菜單欄中的Windows,然後選擇Preferences,在彈出的對話框中,展開左邊的Maven項,選擇Installation子項,在右邊的面板中,我們能夠看到有一個默認的Embedded Maven安裝被選中了,點擊Add…然後選擇我們的Maven安裝目錄M2_HOME,添加完畢之後選擇這一個外部的Maven,如圖2-14所示:


第3章 Maven使用入門


3.1 編寫POM

Maven項目的核心是pom.xml。POM(Project Object Model,項目對象模型)定義了項目的基本信息,用於描述項目如何構建,聲明項目依賴,等等。現在我們先爲Hello World項目編寫一個最簡單的pom.xml。

首先創建一個名爲hello-world的文件夾(本書中各章的代碼都會對應一個以ch開頭的項目),打開該文件夾,新建一個名爲pom.xml的文件,輸入其內容如代碼清單3-1:

<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/maven-v4_0_0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>com.wll.mvn</groupId>
	<artifactId>mavenSSH</artifactId>
	<packaging>jar</packaging>
	<version>1.0-SNAPSHOT</version>
	<name>mavenSSH Maven Webapp</name>
	<url>http://maven.apache.org</url>
	
</project>
project是所有pom.xml的根元素,它還聲明瞭一些POM相關的命名空間及xsd元素,雖然這些屬性不是必須的,但使用這些屬性能夠讓第三方工具(如IDE中的XML編輯器)幫助我們快速編輯POM。
根元素下的第一個子元素modelVersion指定了當前POM模型的版本,對於Maven2及Maven 3來說,它只能是4.0.0。
這段代碼中最重要的是groupId,artifactId和version三行。這三個元素定義了一個項目基本的座標,在Maven的世界,任何的jar、pom或者war都是以基於這些基本的座標進行區分的。
groupId定義了項目屬於哪個組,這個組往往和項目所在的組織或公司存在關聯,譬如你在googlecode上建立了一個名爲myapp的項目,那麼groupId就應該是com.googlecode.myapp,如果你的公司是mycom,有一個項目爲myapp,那麼groupId就應該是com.mycom.myapp。
artifactId定義了當前Maven項目在組中唯一的ID,我們爲這個Hello World項目定義artifactId爲hello-world。而在前面的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等等。
name元素聲明瞭一個對於用戶更爲友好的項目名稱,雖然這不是必須的,但我還是推薦爲每個POM聲明name,以方便信息交流。

沒有任何實際的Java代碼,我們就能夠定義一個Maven項目的POM,這體現了Maven的一大優點,它能讓項目對象模型最大程度地與實際代碼相獨立,我們可以稱之爲解耦,或者正交性,這在很大程度上避免了Java代碼和POM代碼的相互影響。比如當項目需要升級版本時,只需要修改POM,而不需要更改Java代碼;而在POM穩定之後,日常的Java代碼開發工作基本不涉及POM的修改。

3.2 編寫主代碼

項目主代碼和測試代碼不同,項目的主代碼會被打包到最終的構件中(比如jar),而測試代碼只在運行測試時用到,不會被打包。默認情況下,Maven假設項目主代碼位於src/main/java目錄,我們遵循Maven的約定,創建該目錄,然後在該目錄下創建文件com/wll/mvn/helloworld/HelloWorld.java,其內容如代碼清單3-2:

package com.wll.mvn.helloworld;

public class HelloWorld {

	public String sayHello(){
		
		return "Hello Maven";
	}
	
	public static void main(String[] args) {
		System.out.println(new HelloWorld().sayHello());
	}
	
}
關於該Java代碼有兩點需要注意。首先,在95%以上的情況下,我們應該把項目主代碼放到src/main/java/目錄下(遵循Maven的約定),而無須額外的配置,Maven會自動搜尋該目錄找到項目主代碼。其次,該Java類的包名是com.wll.mvn.helloworld,這與我們之前在POM中定義的groupId和artifactId相吻合。一般來說,項目中Java類的包都應該基於項目的groupId和artifactId,這樣更加清晰,更加符合邏輯,也方便搜索構件或者Java類。
代碼編寫完畢後,我們使用Maven進行編譯,在項目根目錄下運行命令 mvn clean compile ,執行該命令Maven會自動訪問中央倉庫(http://search.maven.org)下載所需jar包,最終會得到如下輸出:

...
[INFO] Scanning for projects...  
[INFO] ------------------------------------------------------------------------  
[INFO] Building Maven Hello World Project  
[INFO]    task-segment: [clean, compile]  
[INFO] ------------------------------------------------------------------------  
[INFO] [clean:clean {execution: default-clean}]  
[INFO] Deleting directory D:\code\hello-world\target  
[INFO] [resources:resources {execution: default-resources}]  
[INFO] skip non existing resourceDirectory D: \code\hello-world\src\main\resources  
[INFO] [compiler:compile {execution: default-compile}]  
[INFO] Compiling 1 source file to D: \code\hello-world\target\classes  
[INFO] ------------------------------------------------------------------------  
[INFO] BUILD SUCCESSFUL  
[INFO] ------------------------------------------------------------------------  
[INFO] Total time: 1 second  
[INFO] Finished at: Fri Oct 09 02:08:09 CST 2009  
[INFO] Final Memory: 9M/16M  
[INFO] ------------------------------------------------------------------------  
...
clean告訴Maven清理輸出目錄target/,compile告訴Maven編譯項目主代碼,從輸出中我們看到Maven首先執行了clean:clean任務,刪除target/目錄,默認情況下Maven構建的所有輸出都在target/目錄中;接着執行resources:resources任務(未定義項目資源,暫且略過);最後執行compiler:compile任務,將項目主代碼編譯至target/classes目錄(編譯好的類爲com/wll/mvn/helloworld/HelloWorld.Class)。
上文提到的clean:clean、resources:resources,以及compiler:compile對應了一些Maven插件及插件目標,比如clean:clean是clean插件的clean目標,compiler:compile是compiler插件的compile目標。

3.3 編寫測試代碼
爲了使項目結構保持清晰,主代碼與測試代碼應該分別位於獨立的目錄中。Maven項目中默認的主代碼目錄是src/main/java,對應地,Maven項目中默認的測試代碼目錄是src/test/java。因此,在編寫測試用例之前,我們先創建該目錄。


在Java世界中,由Kent Beck和Erich Gamma建立的JUnit是事實上的單元測試標準。要使用JUnit,我們首先需要爲Hello World項目添加一個JUnit依賴,修改項目的POM如代碼清單3-3:

<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/maven-v4_0_0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>com.wll.mvn</groupId>
	<artifactId>mavenSSH</artifactId>
	<packaging>jar</packaging>
	<version>1.0-SNAPSHOT</version>
	<name>mavenSSH Maven Webapp</name>
	<url>http://maven.apache.org</url>
	<dependencies>
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>4.9</version>
			<scope>test</scope>
		</dependency>
	</dependencies>
	

</project>
代碼中添加了dependencies元素,該元素下可以包含多個dependency元素以聲明項目的依賴,這裏我們添加了一個依賴——groupId是junit,artifactId是junit,version是4.9。有了這段聲明,Maven就能夠自動下載junit-4.9.jar。配置了測試依賴,接着就可以編寫測試類,回顧一下前面的HelloWorld類,現在我們要測試該類的sayHello()方法,檢查其返回值是否爲“Hello Maven”。在src/test/java目錄下創建文件,其內容如代碼清單3-4:

package com.wll.mvn.helloworld;


import org.junit.Assert;
import org.junit.Test;

public class HelloWorldTest{

	@Test
	public void testSayHello(){
		HelloWorld hello = new HelloWorld();
		String result = hello.sayHello();
		Assert.assertEquals("Hello Maven", result);
	}
}
測試用例編寫完畢之後就可以調用Maven執行測試,運行 mvn clean test,執行該命令Maven會自動訪問中央倉庫(http://search.maven.org)下載所需jar包,從輸出中看到Maven從中央倉庫下載了junit-4.9.pom和junit-4.9.jar這兩個文件到本地倉庫(~/.m2/repository)中,供所有Maven項目使用。最終會得到如下輸出:
…  
[INFO] [compiler:testCompile {execution: default-testCompile}]  
[INFO] Compiling 1 source file to D: \code\hello-world\target\test-classes  
[INFO] [surefire:test {execution: default-test}]  
[INFO] Surefire report directory: D:\code\hello-world\target\surefire-reports  
-------------------------------------------------------  
 T E S T S  
-------------------------------------------------------  
Running com.juvenxu.mvnbook.helloworld.HelloWorldTest  
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.055 sec  
Results :  
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0  
[INFO] ------------------------------------------------------------------------  
[INFO] BUILD SUCCESSFUL  
[INFO] ------------------------------------------------------------------------  
…  
3.4 打包和運行

將項目進行編譯、測試之後,下一個重要步驟就是打包(package)。Hello World的POM中沒有指定打包類型,使用默認打包類型jar,我們可以簡單地執行命令 mvn clean package 進行打包,可以看到如下輸出:
…  
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0  
  
[INFO] [jar:jar {execution: default-jar}]  
[INFO] Building jar: D:\code\hello-world\target\hello-world-1.0-SNAPSHOT.jar  
[INFO]   
--------------------------------------------------------------------  
[INFO] BUILD SUCCESSFUL  
…  
類似地,Maven會在打包之前執行編譯、測試等操作。這裏我們看到jar:jar任務負責打包,實際上就是jar插件的jar目標將項目主代碼打包成一個名爲hello-world-1.0-SNAPSHOT.jar的文件,該文件也位於target/輸出目錄中,它是根據artifact-version.jar規則進行命名的。

至此,我們得到了項目的輸出,如果有需要的話,就可以複製這個jar文件到其他項目的Classpath中從而使用HelloWorld類。但是,如何才能讓其他的Maven項目直接引用這個jar呢?我們還需要一個安裝的步驟,執行 mvn clean install
   …  
   [INFO] [jar:jar {execution: default-jar}]  
   [INFO] Building jar: D: \code\hello-world\target\hello-world-1.0-SNAPSHOT.jar  
   [INFO] [install:install {execution: default-install}]  
   [INFO] Installing D:\code\hello-world\target\hello-world-1.0-SNAPSHOT.jar to C:\Users\juven\.m2\repository\com\juvenxu\mvnbook\hello-world\1.0-SNAPSHOT\hello-world-1.0-SNAPSHOT.jar  
   [INFO]  
------------------------------------------------------------------------  
   [INFO] BUILD SUCCESSFUL  
   …  
在打包之後,我們又執行了安裝任務install:install,從輸出我們看到該任務將項目輸出的jar安裝到了Maven本地倉庫中,只有將Hello World的構件安裝到本地倉庫之後,其他Maven項目才能使用它。

我們已經將體驗了Maven最主要的命令:mvn clean compile、mvn clean test、mvn clean package、mvn clean install。執行test之前是會先執行compile的,執行package之前是會先執行test的,而類似地,install之前會執行package。我們可以在任何一個Maven項目中執行這些命令。

到目前爲止,我們還沒有運行Hello World項目,不要忘了HelloWorld類可是有一個main方法的。
默認打包生成的jar是不能夠直接運行的,因爲帶有main方法的類信息不會添加到manifest中(我們可以打開jar文件中的META-INF/MANIFEST.MF文件,將無法看到Main-Class一行)。爲了生成可執行的jar文件,我們需要藉助maven-shade-plugin,配置該插件如下:
		<plugins>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-shade-plugin</artifactId>
				<version>1.2.1</version>
				<executions>
					<execution>
						<phase>package</phase>
						<goals>
							<goal>shade</goal>
						</goals>
						<configuration>
							<transformers>
								<transformer
									implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
									<!-- 將該信息放到MANIFEST中 -->
									<mainClass>com.wll.mvn.helloworld.HelloWorld</mainClass>
								</transformer>
							</transformers>
						</configuration>
					</execution>
				</executions>
			</plugin>
		</plugins>
plugin元素在POM中的相對位置應該在<project><build><plugins>下面。我們配置了mainClass爲com.wll.mvn.helloworld.HelloWorld,項目在打包時會將該信息放到MANIFEST中。現在執行 mvn clean install ,待構建完成之後打開target/目錄,我們可以看到hello-world-1.0-SNAPSHOT.jar和original-hello-world-1.0-SNAPSHOT.jar,前者是帶有Main-Class信息的可運行jar,後者是原始的jar,打開hello-world-1.0-SNAPSHOT.jar的META-INF/MANIFEST.MF,可以看到它包含這樣一行信息:
Main-Class: com.juvenxu.mvnbook.helloworld.HelloWorld
現在,我們在項目根目錄中執行該jar文件:
D: \code\hello-world>java -jar target\hello-world-1.0-SNAPSHOT.jar
Hello Maven
控制檯輸出爲Hello Maven,這正是我們所期望的。


3.5 m2eclipse簡單使用


3.5.1 導入Maven項目

前面介紹瞭如何安裝m2eclipse,現在我們使用m2ecilpse導入Hello World項目。選擇菜單項File->Import,我們會看到一個Import對話框,在該對話框中選擇General目錄下的Maven Projects,然後點擊Next,就會出現Import Projects對話框,在該對話框中點擊Browse…選擇Hello World的根目錄(即包含pom.xml文件的那個目錄),這時對話框中的Projects:部分就會顯示該目錄包含的Maven項目,如圖3-1所示:

3.5.2 創建Maven項目
創建一個Maven項目也十分簡單,選擇菜單項File -> New -> Other,在彈出的對話框中選擇Maven下的Maven Project,然後點擊Next >,在彈出的New Maven Project對話框中,我們使用默認的選項(不要選擇Create a simple project選項,那樣我們就能使用Maven Archetype),點擊Next >,此時m2eclipse會提示我們選擇一個Archetype,我們選擇maven-archetype-webapp,再點擊Next >。輸入groupId,、artifactId、version、package(暫時我們不考慮Properties),如圖3-3所示:

3.5.3 運行mvn命令
我們需要在命令行輸入如mvn clean install之類的命令來執行maven構建,m2eclipse中也有對應的功能,在Maven項目或者pom.xml上右擊,再選擇Run As,就能看到如下的常見Maven命令,如圖3-4所示:

博文參考:http://www.cnblogs.com/dcba1112/archive/2011/05/01/2033805.html

發佈了50 篇原創文章 · 獲贊 48 · 訪問量 45萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章