Windows7下Maven環境搭建及其使用
1.軟件下載
1.下載JDK
下載地址:
http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
下載的安裝包為jdk-8u101-windows-x64.exe
2.下載Maven
下載地址:http://maven.apache.org/download.cgi
下載的是最新版本apache-maven-3.3.9-bin.zip
註:安裝Maven3.3需要提前安裝好JDK 1.7以上版本
2.JDK安裝配置
1.安裝JDK
雙擊安裝包,點擊下一步,如圖:
點擊更改選擇JDK安裝的目錄後(這個很重要,記住安裝路徑),點擊下一 步,完成JDK的安裝。
這個時候,就在安裝JDK了。等出現下圖,表示JDK安裝成功:
2.配置JDK
右擊計算機,選擇屬性->高級系統設置->環境變量,點擊系統變量的新建按鈕。變量名為JAVA_HOME,變量值為你安裝JDK時的路徑,我當時安裝在C盤下,所以變量值就為[C:\Program Files\Java\jdk1.8.0_101],配置完成後點擊確定。
在系統變量中找到Path後,在變量值最後加上:[%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;] 如圖:
完成後點擊確定按鈕,點擊系統變量的新建按鈕,變量名為CLASSPATH,變量值為[.;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar] 如圖:
以上就完成了JDK的安裝與配置,下面來測試安裝是否成功,開始-運行-cmd進入命令框,在命令框中輸入Java -version,出現下圖表示安裝成功!
3.Maven安裝配置
【必須先下載並安裝JDK,配置JDK的環境變量JAVA_HOME,否則maven無法使用eclipse安裝maven插件後必須重新定位maven到本地maven目錄】
1.安裝Maven
將下載好的Maven安裝包解壓到磁盤中,我解壓的路徑為D:\apache-maven-3.3.9
配置環境變量 |
右擊計算機,選擇屬性->高級系統設置->環境變量,點擊系統變量的新建按鈕。添加新的系統環境變量MAVEN_HOME,設置其值為剛才解壓的maven路徑:[D:\apache-maven-3.3.9],如圖:
配置系統的path變量,在其尾部加添加[;%MAVEN_HOME%\bin;],如圖:
(還有一個可選的環境變量MAVEN_OPTS,該環境變量主要是配置Maven在使用jdk的時候指定JVM屬性的。如指定其值為“-Xms256m -Xmx512m”)
接下來我們可以在命令窗口使用mvn -v來驗證一下Maven是否安裝成功。如能正確輸出Maven的安裝版本,則表示它安裝成功了,如圖:
2.理解“倉庫”概念
首次運行完mvn -version後,會在用戶目錄下創建一個.m2的目錄(比如:C:\Users\當前用戶名\.m2\),這個目錄是maven的“本地倉庫”,倉庫是maven中一個很重要的概念。
試想一下,我們會在工作中同時創建很多項目,每個項目可能都會引用一些公用的jar包(.NET中是dll文件),一種作法是每個項目裏,都復制一份這些依賴的jar包(或dll文件),這樣顯然不好,相同的文件在硬盤上保存了多份,太占用空間,而且這些依賴的jar包(或dll文件)的版本也不太好管理(比如某個公用的jar包,從1.0升級到2.0,如果所有引用這個jar包的項目都需要更新,必須一個個項目的修改)。
maven的倉庫則很好的解決了這些問題,它在每臺機器上創建一個本機倉庫,把本機上所有maven項目依賴的jar包統一管理起來,而且這些jar包用“坐標”來唯一標識(註:坐標是另一個重要的概念,後面還會講到,這裏只要簡單理解成“唯一識別某個jar包文件名、版本號”的標識即可),這樣所有maven項目就不需要再象以前那樣把jar包復制到lib目錄中,整個maven項目看起來十分清爽。
3.配置Maven環境
在Maven中提供了一個settings.xml文件來定義Maven的全局環境信息。這個文件會存在於Maven的安裝目錄的conf子目錄下面,或者是用戶家目錄的.m2子目錄下面。我們可以通過這個文件來定義本地倉庫、遠程倉庫和聯網使用的代理信息等。
其實相對於多用戶的PC機而言,在Maven安裝目錄的conf子目錄下面的settings.xml才是真正的全局的配置。而用戶家目錄的.m2子目錄下面的settings.xml的配置只是針對當前用戶的。當這兩個文件同時存在的時候,那麽對於相同的配置信息用戶家目錄下面的settings.xml中定義的會覆蓋Maven安裝目錄下面的settings.xml中的定義。用戶家目錄下的settings.xml文件一般是不存在的,但是Maven允許我們在這裏定義我們自己的settings.xml,如果需要在這裏定義我們自己的settings.xml的時候就可以把Maven安裝目錄下面的settings.xml文件拷貝到用戶家目錄的.m2目錄下,然後改成自己想要的樣子。
先來看一個基本的settings.xml的樣子:
[html] view plain copy
- <?xml version="1.0" encoding="UTF-8"?>
- <settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
- <localRepository>/path/to/local/repo</localRepository>
- <interactiveMode>true</interactiveMode>
- <offline>false</offline>
- <pluginGroups>
- </pluginGroups>
- <proxies>
- <proxy>
- <id>optional</id>
- <active>true</active>
- <protocol>http</protocol>
- <username>proxyuser</username>
- <password>proxypass</password>
- <host>proxy.host.net</host>
- <port>80</port>
- <nonProxyHosts>local.net|some.host.com</nonProxyHosts>
- </proxy>
- </proxies>
- <servers>
- <server>
- <id>deploymentRepo</id>
- <username>repouser</username>
- <password>repopwd</password>
- </server>
- </server>
- <mirrors>
- <mirror>
- <id>mirrorId</id>
- <mirrorOf>repositoryId</mirrorOf>
- <name>Human Readable Name for this Mirror.</name>
- <url>http://my.repository.com/repo/path</url>
- </mirror>
- </mirrors>
- <profiles>
- <profile>
- <id>jdk-1.4</id>
- <activation>
- <jdk>1.4</jdk>
- </activation>
- <repositories>
- <repository>
- <id>jdk14</id>
- <name>Repository for JDK 1.4 builds</name>
- <url>http://www.myhost.com/maven/jdk14</url>
- <layout>default</layout>
- <snapshotPolicy>always</snapshotPolicy>
- </repository>
- </repositories>
- </profile>
- </profiles>
- <activeProfiles>
- <activeProfile>alwaysActiveProfile</activeProfile>
- <activeProfile>anotherAlwaysActiveProfile</activeProfile>
- </activeProfiles>
- </settings>
settings.xml中主要包括以下元素:
localRepository:表示Maven用來在本地儲存信息的本地倉庫的目錄。默認是用戶家目錄下面的.m2/repository目錄。
[html] view plain copy- <localRepository>/path/to/local/repo</localRepository>
interactiveMode:表示是否使用交互模式,默認是true;如果設為false,那麽當Maven需要用戶進行輸入的時候,它會使用一個默認值。
[html] view plain copy- <interactiveMode>true</interactiveMode>
offline:表示是否離線,默認是false。這個屬性表示在Maven進行項目編譯和部署等操作時是否允許Maven進行聯網來下載所需要的信息。
[html] view plain copy
- <offline>false</offline>
pluginGroups:在pluginGroups元素下面可以定義一系列的pluginGroup元素。表示當通過plugin的前綴來解析plugin的時候到哪裏尋找。pluginGroup元素指定的是plugin的groupId。默認情況下,Maven會自動把org.apache.maven.plugins和org.codehaus.mojo添加到pluginGroups下。
[html] view plain copy- <pluginGroups> </pluginGroups>
proxies:其下面可以定義一系列的proxy子元素,表示Maven在進行聯網時需要使用到的代理。當設置了多個代理的時候第一個標記active為true的代理將會被使用。
[html] view plain copy- <proxies>
- <proxy>
- <id>optional</id>
- <active>true</active>
- <protocol>http</protocol>
- <username>proxyuser</username>
- <password>proxypass</password>
- <host>proxy.host.net</host>
- <port>80</port>
- <nonProxyHosts>local.net|some.host.com</nonProxyHosts>
- </proxy>
- </proxies>
servers:其下面可以定義一系列的server子元素,表示當需要連接到一個遠程服務器的時候需要使用到的驗證方式。這主要有username/password和privateKey/passphrase這兩種方式。
[html] view plain copy- <servers>
- <server>
- <id>deploymentRepo</id>
- <username>repouser</username>
- <password>repopwd</password>
- </server>
- </server>
mirrors:用於定義一系列的遠程倉庫的鏡像。我們可以在pom中定義一個下載工件的時候所使用的遠程倉庫。但是有時候這個遠程倉庫會比較忙,所以這個時候人們就想著給它創建鏡像以緩解遠程倉庫的壓力,也就是說會把對遠程倉庫的請求轉換到對其鏡像地址的請求。每個遠程倉庫都會有一個id,這樣我們就可以創建自己的mirror來關聯到該倉庫,那麽以後需要從遠程倉庫下載工件的時候Maven就可以從我們定義好的mirror站點來下載,這可以很好的緩解我們遠程倉庫的壓力。在我們定義的mirror中每個遠程倉庫都只能有一個mirror與它關聯,也就是說你不能同時配置多個mirror的mirrorOf指向同一個repositoryId。
[html] view plain copy- <mirrors>
- <mirror>
- <id>mirrorId</id>
- <mirrorOf>repositoryId</mirrorOf>
- <name>Human Readable Name for this Mirror.</name>
- <url>http://my.repository.com/repo/path</url>
- </mirror>
- </mirrors>
l id:是用來區別mirror的,所有的mirror不能有相同的id
l mirrorOf:用來表示該mirror是關聯的哪一個倉庫,其值為其關聯倉庫的id。當要同時關聯多個倉庫時,這多個倉庫之間可以用逗號隔開;當要關聯所有的倉庫時,可以使用“*”表示;當要關聯除某一個倉庫以外的其他所有倉庫時,可以表示為“*,!repositoryId”;當要關聯不是localhost或用file請求的倉庫時,可以表示為“external:*”。
l url:表示該鏡像的url。當Maven在建立系統的時候就會使用這個url來連接到我們的遠程倉庫。
profiles:用於指定一系列的profile。profile元素由activation、repositories、pluginRepositories和properties四個元素組成。當一個profile在settings.xml中是處於活動狀態並且在pom.xml中定義了一個相同id的profile時,settings.xml中的profile會覆蓋pom.xml中的profile。
[html] view plain copy- <profiles>
- <profile>
- <id>jdk-1.4</id>
- <activation>
- <jdk>1.4</jdk>
- </activation>
- <repositories>
- <repository>
- <id>jdk14</id>
- <name>Repository for JDK 1.4 builds</name>
- <url>http://www.myhost.com/maven/jdk14</url>
- <layout>default</layout>
- <snapshotPolicy>always</snapshotPolicy>
- </repository>
- </repositories>
- t;/profile>
- </profiles>
activation:這是profile中最重要的元素。跟pom.xml中的profile一樣,settings.xml中的profile也可以在特定環境下改變一些值,而這些環境是通過activation元素來指定的。
在上面這段代碼中,當所有的約束條件都滿足的時候就會激活這個profile。
jdk:表示當jdk的版本滿足條件的時候激活,在這裏是1.4。這裏的版本還可以用一個範圍來表示,如
<jdk>[1.4,1.7]</jdk>表示1.4、1.5、1.6和1.7滿足;
activeProfiles:底包含一系列的activeProfile元素,表示對於所有的pom都處於活躍狀態的profile。
[html] view plain copy- <activeProfiles>
- <activeProfile>alwaysActiveProfile</activeProfile>
- <activeProfile>anotherAlwaysActiveProfile</activeProfile>
- </activeProfiles>
4.Maven使用入門
到目前為止,已經大概安裝好了Maven,現在開始創建一個最簡單的Hello World項目。
1.創建項目
在命令行輸入:
mvn archetype:generate -DgroupId=com.mycompany.app -DartifactId=my-app -Dversion=1.0
回車,如圖:
執行Maven命令(goal)archetype:generate,並且設置了一些參數
( -DgroupId=com.mycompany.app -DartifactId=my-app -Dversion=1.0)
【mvn archetype:generate 創建maven項目;
-DgroupId=com.mycompany.app組ID;
-DartifactId=my-app項目名稱
-Dversion=1.0版本】
如果你是首次運行該命令(goal),maven將要花一些時間從maven庫去把最新的工具包(Maven把它叫作artifacts)下載到你的本地倉庫(local repository)中,所以這個時候需要Internet連接。Maven默認的本地庫是%USER_HOME%\.m2\repository\,比如我的本地庫路徑為:C:\User\fulei\.m2\repository\。
命令執行完後你將看到maven生成了一個名為my-app的目錄,這個名字就是你在命令中指定的artifactId,進入該目錄,你將發現以下標準的項目結構:
其中:src/main/java 目錄包含了項目的源代碼,src/test/java 目錄包含了項目的測試代碼,pom.xml是項目的項目對象模型(Project Object Model or POM)。
2.POM代碼介紹
就像Make的Makefile、Ant的build.xml一樣,Maven項目的核心是pom.xml。POM(Project Object Model,項目對象模型)定義了項目的基本信息,用於描述項目如何構建,聲明項目依賴等。下面列出這個POM的內容:
[html] view plain copy- <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.mycompany.app</groupId>
- <artifactId>my-app</artifactId>
- <version>1.0</version>
- <packaging>jar</packaging>
- <name>my-app</name>
- <url>http://maven.apache.org</url>
- <properties>
- <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
- </properties>
- <dependencies>
- <dependency>
- <groupId>junit</groupId>
- <artifactId>junit</artifactId>
- <version>3.8.1</version>
- <scope>test</scope>
- </dependency>
- </dependencies>
- </project>
代碼第一行是XML頭,指定了該xml文檔的版本和編碼方式。緊接著是project元素,project是所有pom.xml的根元素,它還聲明了一些POM相關的命名空間及xsd元素,雖然這些屬性不是必須的,但是用這些屬性能夠讓第三方工具能夠快速編輯POM。
根元素的第一個元素modelVersion指定了當前POM模型的版本,對於Maven2及Maven3來說,它只能是4.0.0。
這段代碼中最重要的是groupID、artifactID和version的三行。這三個元素定義了一個項目基本的坐標,在Maven項目中,任何的jar、pom或者version都是以基於這些基本的坐標進行區分的。
groupID定義了項目屬於哪個組,這個組往往和項目所在的組織或公司存在關聯。比如在googlecode上建立了一個myapp的項目,那麽groupID就是com.googlecode.myapp。
· 簡而言之:
· modelVersion: 這個XML文件所使用的POM格式的版本
· groupId: 相當於這個project的所有者或者機構的一個標識,一般是com.company.xxx這種格式
· artifactId: 這個project最後所生成的文檔(jar、war)的名字,比如對於junit這個開源的project,它的artifactId就是junit
· packaging: 這個project的打包的類型,一般是war、jar等值
· version: project的版本
· name: project的名字,生成文檔等內容的時候會用的這個名字
3.主代碼
項目主代碼和測試代碼不同,項目的主代碼會被打包到最終的構件中(如jar),而測試代碼只在運行測試時用到,不會被打包。默認情況下,Maven項目主代碼位於src/main/java目錄,所以在該目錄下創建文件com/mycompany/app/App.java,其代碼內容如下:
[java] view plain copy- package com.mycompany.app;
- /**
- * Hello world!
- */
- public class App
- {
- public static void main( String[] args )
- {
- System.out.println( "Hello World!" );
- }
- }
關於Java代碼有兩點需要註意。首先,在絕大多數情況下,應該把項目主代碼放到src/main/java目錄下(遵循Maven的約定),而無須額外的配置,Maven會自動搜尋該目錄找到項目主代碼,其次,該Java類的包命是com.mycompany.app
這與POM中定義的groupID和artifactID相吻合,項目中Java類的包都應該基於項目的groupID和artifactID,這樣更加清晰,更加符合邏輯,也可以方便搜索構件或Java類。
4.編譯
使用Maven進行編譯,在項目根目錄下運行命令mvn clean compile,會得到如下輸出:
clean告訴Maven清理輸出目錄target/,compile告訴Maven編譯項目主代碼,從輸出中看到Maven實現執行了clean:clean任務,刪除target/目錄。默認情況下,Maven構建的所有輸出都在target/目錄中;接著執行resources:resources任務(未定義項目資源,暫時略過);之後執行compile:compile任務,將項目主代碼編譯至target/classes目錄(編譯好的類為com/mycompany/app/App.class)
5.測試
主代碼與測試代碼分別位於獨立的目錄中,Maven項目中的默認的測試代碼了目錄為src/test/java。
在Java世界中,JUnit是事實上的單元測試標準,要使用JUnit,要為項目添加JUnit依賴,項目POM代碼中:
[html] view plain copy- <dependencies>
- <dependency>
- <groupId>junit</groupId>
- <artifactId>junit</artifactId>
- <version>3.8.1</version>
- <scope>test</scope>
- </dependency>
- </dependencies>
代碼中有dependencies元素,該元素下可以包含多個dependency元素以聲明項目的依賴,這裏添加了一個依賴--groupID是junit,artifactID是junit,version是3.8.1,有了這段聲明,Maven就能夠自動下載junit-3.8.1.jar。有了Maven,它會自動訪問中央倉庫,下載需要的文件。也可以自己訪問該倉庫,打卡路徑junit/junit/3.8.1/,就能看到junit-3.8.1pom和junit-3.8.1.jar。
上述POM代碼中還有一個值為test的元素scope,scope為依賴範圍,若依賴範圍為test則表示該依賴只對測試有效。換句話說,測試代碼中的import JUnit代碼是沒有問題的,但是如果在主代碼中用import JUnit代碼,就會對造成編譯錯誤。如果不聲明依賴範圍,那麽默認值就是compile,表示該依賴對主代碼和測試代碼都有效。
打開測試用例代碼,在src/test/java目錄下的AppTest.java,代碼如下:
[java] view plain copy- package com.mycompany.app;
- import junit.framework.Test;
- import junit.framework.TestCase;
- import junit.framework.TestSuite;
- /**
- * Unit test for simple App.
- */
- public class AppTest
- extends TestCase
- {
- /**
- * Create the test case
- *
- * @param testName name of the test case
- */
- public AppTest( String testName )
- {
- super( testName );
- }
- /**
- * @return the suite of tests being tested
- */
- public static Test suite()
- {
- return new TestSuite( AppTest.class );
- }
- /**
- Rigourous Test :-)
- */
- public void testApp()
- {
- assertTrue( true );
- }
- }
調用Maven執行測試,運行mvn clean test,如圖:
測試代碼通過編譯後在target/test-classes下生成了二進制文件,緊接著surefire:test任務運行測試,surefire是Maven中負責執行測試的插件,這裏它運行測試用例AppTest,並輸出測試報告,顯示一共運行了多少測試,失敗了多少,出錯了多少,跳過了多少。顯然,測試通過了。
6.打包
在命令行上輸入:cd my-app回車,進入到項目路徑下,再輸入mvn package回車這時命令行將會打印出各種動作,並且以下面一段信息結束,如圖:
此時,maven在my-app下面建立了一個新的目錄target/,構建打包後的jar文件my-app-1.0.jar就存放在這個目錄下。編譯後的class文件放在target/classes/目錄下面,測試class文件放在target/test-classes/目錄下面。
7.運行
執行下面的命令:
java -cp target/my-app-1.0.jar com.mycompany.app.App,結果如圖:
至此,我們得到了項目的輸出。
8.安裝JAR包
如果需要的話,可以復制這個jar文件到其他項目的Classpath中從而使用my-app類。還需要一個安裝的步驟,執行mvn clean install:
在打包之後,有執行了安裝任務install:install。從輸出可以看到該任務將項目輸出的jar安裝到了Maven本地倉庫中,可以打開相應的文件夾看到my-app項目的pom和jar。我們說只有將構件下載到本地倉庫中,才能由所有Maven項目使用。
到這裏就說完了創建,編譯,測試,打包以及安裝,大部分的項目也就是做這些事情。
Maven最主要的命令:mvn clean compile、mvn clean test、mvn clean package、mvn clean install。
Maven有一套build的生命周期,是按照一套順序走下來的,這一套順序就叫一個生命周期(lifecycle)。一個生命周期分為多個階段(build phase),每一個build phase是由目標(goal)組成的,一個goal其實就是一個任務,目標可以綁定到生命周期階段上。一個生命周期階段可以綁定多個插件目標。當maven在構建過程中逐步的通過每個階段時,會執行該階段所有的插件目標。比如執行打包命令:
mvn package時,會先執行compile,再執行test,最後才是package打包。
好了,maven的核心概念就簡單的介紹到這裏。
Windows7下Maven環境搭建及其使用