1. 程式人生 > >Windows7下Maven環境搭建及其使用

Windows7下Maven環境搭建及其使用

target 所有 import 很好 JD protoc end jdk off

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 : D:\apache-maven-3.3.9
MAVEN : %MAVEN_HOME%\bin
(可選) MAVEN_OPTS : -Xms256m -Xmx512m

右擊計算機,選擇屬性->高級系統設置->環境變量,點擊系統變量的新建按鈕。添加新的系統環境變量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
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
  5. <localRepository>/path/to/local/repo</localRepository>
  6. <interactiveMode>true</interactiveMode>
  7. <offline>false</offline>
  8. <pluginGroups>
  9. </pluginGroups>
  10. <proxies>
  11. <proxy>
  12. <id>optional</id>
  13. <active>true</active>
  14. <protocol>http</protocol>
  15. <username>proxyuser</username>
  16. <password>proxypass</password>
  17. <host>proxy.host.net</host>
  18. <port>80</port>
  19. <nonProxyHosts>local.net|some.host.com</nonProxyHosts>
  20. </proxy>
  21. </proxies>
  22. <servers>
  23. <server>
  24. <id>deploymentRepo</id>
  25. <username>repouser</username>
  26. <password>repopwd</password>
  27. </server>
  28. </server>
  29. <mirrors>
  30. <mirror>
  31. <id>mirrorId</id>
  32. <mirrorOf>repositoryId</mirrorOf>
  33. <name>Human Readable Name for this Mirror.</name>
  34. <url>http://my.repository.com/repo/path</url>
  35. </mirror>
  36. </mirrors>
  37. <profiles>
  38. <profile>
  39. <id>jdk-1.4</id>
  40. <activation>
  41. <jdk>1.4</jdk>
  42. </activation>
  43. <repositories>
  44. <repository>
  45. <id>jdk14</id>
  46. <name>Repository for JDK 1.4 builds</name>
  47. <url>http://www.myhost.com/maven/jdk14</url>
  48. <layout>default</layout>
  49. <snapshotPolicy>always</snapshotPolicy>
  50. </repository>
  51. </repositories>
  52. </profile>
  53. </profiles>
  54. <activeProfiles>
  55. <activeProfile>alwaysActiveProfile</activeProfile>
  56. <activeProfile>anotherAlwaysActiveProfile</activeProfile>
  57. </activeProfiles>
  58. </settings>

settings.xml中主要包括以下元素:

localRepository:表示Maven用來在本地儲存信息的本地倉庫的目錄。默認是用戶家目錄下面的.m2/repository目錄。

[html] view plain copy
  1. <localRepository>/path/to/local/repo</localRepository>

interactiveMode:表示是否使用交互模式,默認是true;如果設為false,那麽當Maven需要用戶進行輸入的時候,它會使用一個默認值。

[html] view plain copy
  1. <interactiveMode>true</interactiveMode>

offline:表示是否離線,默認是false。這個屬性表示在Maven進行項目編譯和部署等操作時是否允許Maven進行聯網來下載所需要的信息。

[html] view plain copy
  1. <offline>false</offline>

pluginGroups:在pluginGroups元素下面可以定義一系列的pluginGroup元素。表示當通過plugin的前綴來解析plugin的時候到哪裏尋找。pluginGroup元素指定的是plugin的groupId。默認情況下,Maven會自動把org.apache.maven.plugins和org.codehaus.mojo添加到pluginGroups下。

[html] view plain copy
  1. <pluginGroups> </pluginGroups>

proxies:其下面可以定義一系列的proxy子元素,表示Maven在進行聯網時需要使用到的代理。當設置了多個代理的時候第一個標記active為true的代理將會被使用。

[html] view plain copy
  1. <proxies>
  2. <proxy>
  3. <id>optional</id>
  4. <active>true</active>
  5. <protocol>http</protocol>
  6. <username>proxyuser</username>
  7. <password>proxypass</password>
  8. <host>proxy.host.net</host>
  9. <port>80</port>
  10. <nonProxyHosts>local.net|some.host.com</nonProxyHosts>
  11. </proxy>
  12. </proxies>

servers:其下面可以定義一系列的server子元素,表示當需要連接到一個遠程服務器的時候需要使用到的驗證方式。這主要有username/password和privateKey/passphrase這兩種方式。

[html] view plain copy
  1. <servers>
  2. <server>
  3. <id>deploymentRepo</id>
  4. <username>repouser</username>
  5. <password>repopwd</password>
  6. </server>
  7. </server>

mirrors:用於定義一系列的遠程倉庫的鏡像。我們可以在pom中定義一個下載工件的時候所使用的遠程倉庫。但是有時候這個遠程倉庫會比較忙,所以這個時候人們就想著給它創建鏡像以緩解遠程倉庫的壓力,也就是說會把對遠程倉庫的請求轉換到對其鏡像地址的請求。每個遠程倉庫都會有一個id,這樣我們就可以創建自己的mirror來關聯到該倉庫,那麽以後需要從遠程倉庫下載工件的時候Maven就可以從我們定義好的mirror站點來下載,這可以很好的緩解我們遠程倉庫的壓力。在我們定義的mirror中每個遠程倉庫都只能有一個mirror與它關聯,也就是說你不能同時配置多個mirror的mirrorOf指向同一個repositoryId。

[html] view plain copy
  1. <mirrors>
  2. <mirror>
  3. <id>mirrorId</id>
  4. <mirrorOf>repositoryId</mirrorOf>
  5. <name>Human Readable Name for this Mirror.</name>
  6. <url>http://my.repository.com/repo/path</url>
  7. </mirror>
  8. </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
  1. <profiles>
  2. <profile>
  3. <id>jdk-1.4</id>
  4. <activation>
  5. <jdk>1.4</jdk>
  6. </activation>
  7. <repositories>
  8. <repository>
  9. <id>jdk14</id>
  10. <name>Repository for JDK 1.4 builds</name>
  11. <url>http://www.myhost.com/maven/jdk14</url>
  12. <layout>default</layout>
  13. <snapshotPolicy>always</snapshotPolicy>
  14. </repository>
  15. </repositories>
  16. t;/profile>
  17. </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
  1. <activeProfiles>
  2. <activeProfile>alwaysActiveProfile</activeProfile>
  3. <activeProfile>anotherAlwaysActiveProfile</activeProfile>
  4. </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
  1. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  2. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  3. <modelVersion>4.0.0</modelVersion>
  4. <groupId>com.mycompany.app</groupId>
  5. <artifactId>my-app</artifactId>
  6. <version>1.0</version>
  7. <packaging>jar</packaging>
  8. <name>my-app</name>
  9. <url>http://maven.apache.org</url>
  10. <properties>
  11. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  12. </properties>
  13. <dependencies>
  14. <dependency>
  15. <groupId>junit</groupId>
  16. <artifactId>junit</artifactId>
  17. <version>3.8.1</version>
  18. <scope>test</scope>
  19. </dependency>
  20. </dependencies>
  21. </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
  1. package com.mycompany.app;
  2. /**
  3. * Hello world!
  4. */
  5. public class App
  6. {
  7. public static void main( String[] args )
  8. {
  9. System.out.println( "Hello World!" );
  10. }
  11. }

關於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
  1. <dependencies>
  2. <dependency>
  3. <groupId>junit</groupId>
  4. <artifactId>junit</artifactId>
  5. <version>3.8.1</version>
  6. <scope>test</scope>
  7. </dependency>
  8. </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
  1. package com.mycompany.app;
  2. import junit.framework.Test;
  3. import junit.framework.TestCase;
  4. import junit.framework.TestSuite;
  5. /**
  6. * Unit test for simple App.
  7. */
  8. public class AppTest
  9. extends TestCase
  10. {
  11. /**
  12. * Create the test case
  13. *
  14. * @param testName name of the test case
  15. */
  16. public AppTest( String testName )
  17. {
  18. super( testName );
  19. }
  20. /**
  21. * @return the suite of tests being tested
  22. */
  23. public static Test suite()
  24. {
  25. return new TestSuite( AppTest.class );
  26. }
  27. /**
  28. Rigourous Test :-)
  29. */
  30. public void testApp()
  31. {
  32. assertTrue( true );
  33. }
  34. }

調用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環境搭建及其使用