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 : 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的樣子:


<?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目錄。

<localRepository>/path/to/local/repo</localRepository>
interactiveMode:表示是否使用交互模式,默認是true;如果設爲false,那麼當Maven需要用戶進行輸入的時候,它會使用一個默認值。

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

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

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

<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這兩種方式。

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

  <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。

  <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>
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。

  <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的內容:

<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,其代碼內容如下:

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代碼中:

  <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,代碼如下:

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的核心概念就簡單的介紹到這裏。
--------------------- 
原文:https://blog.csdn.net/xuexiaoxu1990/article/details/52882664/ 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章